>백엔드 개발 >C++ >왜 `sizeof`는 C 함수 내부와 외부에서 서로 다른 배열 크기를 제공합니까?

왜 `sizeof`는 C 함수 내부와 외부에서 서로 다른 배열 크기를 제공합니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-19 10:51:09853검색

Why Does `sizeof` Give Different Array Sizes Inside and Outside a C Function?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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