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의 배열 크기를 알려주지 않기 때문입니다.그것은 완전히 다른 일을 합니다.
언급URL : https://stackoverflow.com/questions/2950332/why-does-a-c-array-have-a-wrong-sizeof-value-when-its-passed-to-a-function
'IT' 카테고리의 다른 글
코드를 사용하여 장치 화면 크기 범주(소, 일반, 대, xlarge)를 결정하는 방법은 무엇입니까? (0) | 2023.08.01 |
---|---|
SQLite 파일 위치 핵심 데이터 (0) | 2023.08.01 |
모든_views의 "텍스트" 열 필터링 (0) | 2023.08.01 |
ES8 비동기/대기를 스트림과 함께 사용하는 방법은 무엇입니까? (0) | 2023.08.01 |
시 변 경 트 ( ) 이 리 거 트 벤 정 ( ▁setting ▁ 거 트 ▁change ) ▁event ▁trigger 설 리 정 ) 시 시 변 경 트 ( ) 이 리 거 트 벤 정 ( ▁setting ▁ 거 트 ▁change ) ▁event ▁trigger 설 리 정 ) 시 시 변 경 트.. (0) | 2023.08.01 |