C의 함수에 전달된 배열의 sizeof() 값 불일치 이해
C에서 배열이 전달될 때 예기치 않은 동작이 나타날 수 있습니다. 기능에. 질문이 생깁니다: 왜 sizeof() 연산자는 함수 호출 전에 올바른 값을 제공하면서 배열이 함수에 전달될 때 잘못된 값을 반환합니까?
이 문제를 해결하려면 배열이 다음을 이해해야 합니다. C에서는 함수에 전달될 때 포인터 붕괴가 발생합니다. 배열이 전달되면 배열의 첫 번째 요소를 가리키는 포인터로 변질됩니다. 결과적으로, 함수 매개변수에 sizeof()를 사용하면 전체 배열 대신 포인터의 크기가 평가됩니다.
일반적인 예는 질문에 나와 있습니다.
#include <stdio.h> void test(int arr[]) { int arrSize = (int)(sizeof(arr) / sizeof(arr[0])); printf("%d\n", arrSize); // 2 (wrong?!) } int main (int argc, const char * argv[]) { int point[3] = {50, 30, 12}; int arrSize = (int)(sizeof(point) / sizeof(point[0])); printf("%d\n", arrSize); // 3 (correct :-) ) test(point); return 0; }
기본( ) 함수에서 올바른 배열 크기는 할당된 메모리의 크기(sizeof(point)를 사용하여 얻은)를 각 요소의 크기(sizeof(point[0]))로 나누어 결정됩니다. 그러나 test() 함수에서는 sizeof(arr)가 배열 자체가 아닌 배열에 대한 포인터의 크기를 반환하기 때문에 계산된 배열 크기가 올바르지 않습니다.
이 문제를 해결하고 함수가 배열의 크기를 결정하려면 별도의 매개변수로 전달해야 합니다.
void test(int arr[], size_t elems) { /* ... */ } int main(int argc, const char * argv[]) { int point[3] = {50, 30, 12}; /* ... */ test(point, sizeof(point)/sizeof(point[0])); /* ... */ }
sizeof(point)/sizeof(point[0]) 트릭은 다음 배열에서만 작동한다는 점에 유의하는 것이 중요합니다. 스택에 할당된 배열입니다. 동적으로 할당된 배열의 경우 배열의 크기가 포인터와 함께 저장되지 않으므로 잘못된 결과가 반환됩니다.
위 내용은 C 함수에 `sizeof()`를 전달할 때 잘못된 배열 크기를 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!