2016-08-08 3 views
-1

side main 함수에서 sizeof (Array_Name)를 사용하면이 배열의 바이트 수가 반환되는 반면 사용자 정의 함수 내에서 사용되는 경우 it 포인터의 크기를 반환합니다 (포인터로 함수에 전달되기 때문입니다).사용자 정의 함수 내에서 기본 함수 VS sizeof (Array_Name) 내부의 sizeof (Array_Name)

제 질문은 왜 mainof 내부에 sizeof (Array_Name)이 사용되면 포인터로 취급되지 않습니까?

+0

관련 항목 : http://stackoverflow.com/q/492384/694576 – alk

답변

0

이것은 배열 이름이 함수에 전달 될 때 포인터로 붕괴하기 때문입니다. 예를 들어

int main() 
{ 
    int arr[3] = { 1, 2, 3 }; 
    printf("main: %zu\n", sizeof(arr)); 

    f(arr); 
} 
void f(int *ptr) 
{ 
    printf("%zu", sizeof(ptr)); 
} 

출력 :

main: 3 * sizeof(int) 
f: sizeof(int *) 

또한 (sizeof...는 컴파일러의 실제 값으로 대체되는 경우), 그것은 배열 main 여부 선언되는지에 의존 그다지 . 이 규칙은 더 일반적입니다 : 배열이 선언 된 함수에서, 그것은 실제 배열로 취급됩니다. 함수에 인수로 전달 된 경우에만 첫 번째 요소에 대한 포인터로 변환됩니다. 이것이 배열을 취하는 함수가 첫 번째 요소에 대한 포인터와 size 인수를 취하는 이유입니다.

void print(const int *arr, size_t n) 
{ 
    size_t i; 

    for (i = 0; i < n; ++i) 
     printf("%d\n", arr[i]; 
} 
+0

편집이 완료되지 않았습니다. 그래서 저의 포스트는 처음에는 저 품질이었습니다. downvotes을 재고하십시오. – stackptr

0

필자는 char_Array_Name [20]과 같은 느낌을 가지고 있습니다. 이 함수는 선언 한 함수에서 '20'을 반환하지만 다른 함수에 전달하면 void f (char * Array_Name) {...}가 표시되고 여기에 출력되는 값은 4 또는 8입니다. char *). 이해하기 쉽게하려면 먼저 함수의 인수를 void f (char * My_Pointer) {...}로 바꿉니다. 이제 'sizeof'는 런타임이 아니라 컴파일 타임에 해결된다는 것을 알게되었습니다. 컴파일 타임에는 My_Pointer가 문자 배열을 가리키고 있지만 다양한 배열로 호출 할 수 있으므로 실제로는 (char *)의 크기로 평가하는 것이 좋습니다.