함수에 배열을 전달하면 sizeof() 값이 변경되는 이유
C 프로그래밍에서 배열을 함수에 전달하면 다음과 같은 결과가 발생할 수 있습니다. sizeof()를 사용하여 검색할 때 크기와 관련된 예기치 않은 동작이 발생합니다. 이러한 특이성은 배열 붕괴의 개념 때문에 발생합니다.
배열 붕괴 설명
배열이 함수에 전달되면 암시적으로 변환되거나 "붕괴"됩니다. 첫 번째 요소에 대한 포인터입니다. sizeof()가 이제 원래 배열이 아닌 포인터에서 작동하므로 이 변환은 배열의 실제 크기를 효과적으로 숨깁니다.
코드 예제
다음 코드 조각을 고려하세요. :
#include <stdio.h> void test(int arr[]) { int arrSize = (int)(sizeof(arr) / sizeof(arr[0])); printf("%d\n", arrSize); // 2 (incorrect) } 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()를 두 번 호출합니다. main() 함수 내의 첫 번째 호출은 배열 점의 크기를 3으로 올바르게 반환합니다. 그러나 test() 함수 내의 두 번째 호출은 2를 잘못 반환합니다. 함수에 전달되었습니다.
배열 붕괴 극복
배열에 전달될 때 배열의 실제 크기를 유지하려면 함수를 사용하려면 크기를 지정하는 함수에 추가 매개변수를 명시적으로 전달해야 합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!