C의 함수 내에서 배열 크기 계산이 다른 이유
배열을 함수에 전달할 때 C는 자동으로 배열을 포인터로 분해합니다. 첫 번째 요소로. 이 포인터는 첫 번째 배열 요소의 주소를 전달하지만 크기는 전달하지 않습니다.
다음 예를 고려하세요.
#include <stdio.h> void test(int arr[]) { int arrSize = (int)(sizeof(arr) / sizeof(arr[0])); // Incorrect printf("%d\n", arrSize); } int main() { int point[3] = {50, 30, 12}; int arrSize = (int)(sizeof(point) / sizeof(point[0])); // Correct printf("%d\n", arrSize); // Prints 3 test(point); return 0; }
기본적으로 sizeof(point)는 전체 배열의 크기( 12바이트). 그러나 테스트 내에서 sizeof(arr)는 4바이트(정수 포인터의 크기)를 생성하므로 잘못된 배열 크기 계산이 발생합니다(한 요소 누락).
이 문제를 해결하려면 배열 크기를 명시적으로 지정해야 합니다. 별도의 매개변수로 전달됩니다:
void test(int arr[], size_t elems) { int arrSize = elems; /* ... */ } int main() { int point[3] = {50, 30, 12}; /* ... */ test(point, sizeof(point) / sizeof(point[0])); /* ... */ }
sizeof(point)/sizeof(point[0])는 스택 할당 배열에는 작동하지만 동적으로 할당된 배열에는 작동하지 않습니다. 이는 기본 붕괴 메커니즘에 의존합니다.
위 내용은 왜 `sizeof`는 C 함수 내부와 외부에서 서로 다른 배열 크기를 제공합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!