>백엔드 개발 >C++ >C에서 `sizeof()`가 함수 내부와 외부의 배열에 대해 서로 다른 값을 반환하는 이유는 무엇입니까?

C에서 `sizeof()`가 함수 내부와 외부의 배열에 대해 서로 다른 값을 반환하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-21 18:35:09949검색

Why Does `sizeof()` Return Different Values for Arrays Inside and Outside a Function in C?

함수에 배열을 전달하면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.