문제
왜? 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입니다.이는 배열이 함수에서 포인터로 전달되기 때문입니다.포인터는 단지 메모리 주소일 뿐입니다.
제휴하지 않습니다 StackOverflow