IT

C-Array가 함수로 전달될 때 C-Array의 크기() 값이 잘못된 이유는 무엇입니까?

itgroup 2023. 8. 1. 20:27
반응형

C-Array가 함수로 전달될 때 C-Array의 크기() 값이 잘못된 이유는 무엇입니까?

전체 예:

#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;
}

함수에 전달하기 전에 의 크기가 올바른 값을 제공합니다.함수의 동일한 배열에서 동일한 작업을 수행하면 이상한 결과가 나타납니다.한 가지 요소가 없어요. 왜죠?

배열을 C의 함수로 전달하면 배열은 첫 번째 요소에 대한 포인터로 붕괴됩니다.사용할 때sizeof매개 변수에서 배열 자체가 아니라 포인터의 크기를 사용합니다.

배열의 크기를 알기 위해 함수가 필요한 경우 별도의 매개 변수로 전달해야 합니다.

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포인터),sizeof(point)/sizeof(point[0])Trick은 동적으로 할당된 어레이에서는 작동하지 않고 스택에 할당된 어레이에서만 작동합니다.

배열은 함수 인수로 전달될 때 포인터로 붕괴되기 때문에,sizeof에서는 32비트 및 64비트 플랫폼에 대해 각각 4 및 8을 제공합니다.

또한, 이해하는 것이 중요합니다.sizeof컴파일평가됩니다.그렇기 때문에, 다른 출력을 기대하는 것은 말이 되지 않습니다.test()전달된 내용에 따라.sizeof계산은 함수가 컴파일될 때 수행되었습니다.

왜냐하면, 그것이 통과되면, 배열에 대한 포인터만 실제로 전달되기 때문입니다.

당신의 질문은 C 프로그래밍 FAQ에서도 답변됩니다.질문 6.21.

C, C++ 및 Objective-C에서는 함수가 실제로 배열 매개 변수를 가질 수 없기 때문입니다.어레이 매개 변수와 유사한 매개 변수만 가질 수 있지만 그렇지 않습니다.예를 들어,

void test(int arr[])

컴파일러는 "int 배열처럼 보이는 매개 변수가 있다"고 보고, 이 매개 변수를 "int에 대한 매개 변수"로 바꿉니다.그래서 당신이 작성한 함수는 100%와 완전히 동일합니다.

void test (int* arr)

따라서 (arr)의 함수 크기 안에 "포인트 투 int"의 크기가 표시됩니다.

크기()가 C의 배열 크기를 알려주지 않기 때문입니다.그것은 완전히 다른 일을 합니다.

C++ 기준 크기

언급URL : https://stackoverflow.com/questions/2950332/why-does-a-c-array-have-a-wrong-sizeof-value-when-its-passed-to-a-function

반응형