> 백엔드 개발 > C++ > C 함수에 `sizeof()`를 전달할 때 잘못된 배열 크기를 반환하는 이유는 무엇입니까?

C 함수에 `sizeof()`를 전달할 때 잘못된 배열 크기를 반환하는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2025-01-01 10:41:11
원래의
186명이 탐색했습니다.

Why Does `sizeof()` Return Incorrect Array Sizes When Passed to C Functions?

C의 함수에 전달된 배열의 sizeof() 값 불일치 이해

C에서 배열이 전달될 때 예기치 않은 동작이 나타날 수 있습니다. 기능에. 질문이 생깁니다: 왜 sizeof() 연산자는 함수 호출 전에 올바른 값을 제공하면서 배열이 함수에 전달될 때 잘못된 값을 반환합니까?

이 문제를 해결하려면 배열이 다음을 이해해야 합니다. C에서는 함수에 전달될 때 포인터 붕괴가 발생합니다. 배열이 전달되면 배열의 첫 번째 요소를 가리키는 포인터로 변질됩니다. 결과적으로, 함수 매개변수에 sizeof()를 사용하면 전체 배열 대신 포인터의 크기가 평가됩니다.

일반적인 예는 질문에 나와 있습니다.

#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;
}
로그인 후 복사

기본( ) 함수에서 올바른 배열 크기는 할당된 메모리의 크기(sizeof(point)를 사용하여 얻은)를 각 요소의 크기(sizeof(point[0]))로 나누어 결정됩니다. 그러나 test() 함수에서는 sizeof(arr)가 배열 자체가 아닌 배열에 대한 포인터의 크기를 반환하기 때문에 계산된 배열 크기가 올바르지 않습니다.

이 문제를 해결하고 함수가 배열의 크기를 결정하려면 별도의 매개변수로 전달해야 합니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿