문제

왜? n 같지 않음 8 다음 기능에서?

void foo(char cvalue[8])
{
  int n = sizeof (cvalue);
}

하지만 n 하다 동일 8 이 버전의 함수에서는 다음과 같습니다.

void bar()
{
  char cvalue[8];
  int n = sizeof (cvalue);
}
도움이 되었습니까?

해결책

C에서는 전체 배열을 함수 매개변수로 전달할 수 없기 때문입니다.실제로 포인터를 전달하고 있습니다.괄호는 구문 설탕입니다.이 함수에 원하는 문자 포인터를 전달할 수 있으므로 가리키고 있는 배열의 크기가 8이라는 보장은 없습니다.

// These all do the same thing
void foo(char cvalue[8])
void foo(char cvalue[])
void foo(char *cvalue)

다른 팁

C 및 C++ 배열은 일류 객체가 아닙니다.배열을 함수에 전달할 수 없으며 항상 포인터로 붕괴됩니다.

그러나 포인터와 참조를 배열에 전달할 수 있습니다.이렇게 하면 배열 경계가 붕괴되는 것을 방지할 수 있습니다.따라서 이것은 합법적입니다.

template<typename T, size_t N>
void foo(const T(&arr)[N])
{
    int n = sizeof(arr);
}

첫 번째 예에서 전달된 매개변수인 cvalue는 실제로는 문자 배열에 대한 포인터일 뿐이며 sizeof() 그 중 포인터의 크기를 알 수 있습니다.두 번째 경우에는 이를 지역 변수로 선언하여 전체 배열의 크기를 얻습니다.

32비트 시스템에서 매개변수의 크기는 4이고 -m64로 컴파일된 64비트 시스템에서는 8입니다.이는 배열이 함수에서 포인터로 전달되기 때문입니다.포인터는 단지 메모리 주소일 뿐입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top