2017-05-16 13 views
4

GeeksforGeeks에서 찾은 다음 C 프로그램의 결과를 찾고있었습니다. 여기에 프로그램이 있습니다 :이 코드의다음 C 프로그램의 출력을 어떻게 찾을 수 있습니까?

#include <stdio.h> 
void fun(int ptr[]) 
{ 
    int i; 
    unsigned int n = sizeof(ptr)/sizeof(ptr[0]); 
    for (i=0; i<n; i++) 
    printf("%d ", ptr[i]); 
} 

// Driver program 
int main() 
{ 
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8}; 
    fun(arr); 
    return 0; 
} 

출력은 "1 2"이었다. 그러나 나에 따르면 출력은 단지 이어야합니다.

  1. 첫째, 주요 기능이 실행됩니다되는 배열을 선언 한 후 "편곡"다음 문은 문 재미 (편곡)를 포함하는 실행됩니다 : 다음은이 코드의 내 해석이다.
  2. 이 문장에서 "fun"함수는 배열의 첫 번째 요소의 주소를 포함하는 인수 arr과 함께 호출됩니다.
  3. 그 후에, 재미있는 fun의 밑에, 매개 변수로 포인터 ptr가있다. 이 함수가 실행될 때 ptr의 크기가 4이고 ptr [0]의 크기가 4이기 때문에 n의 값은 1로 계산됩니다.
  4. 다음으로 루프는 한 번만 실행되기 때문에 n이 1이면 ptr [0]의 값이므로 '1'만 인쇄됩니다.

제가 잘못 된 부분을 찾으십시오. ptr의 크기 4ptr[0]하고 크기도 4 여기 이후

+2

C에서는 검사만으로'재미 '의'ptr'(즉 요소의 수) 크기를 찾을 수 없다는 것에 유의하십시오.사용하는 sizeof 계산은 ptr이 고정 크기 배열 ('int ptr [5]'처럼) – pm100

+1

@ pm100 일 경우에만 작동합니다. 어떤 길이의 배열도 그 배열에 전달할 수 있습니다. –

+0

@WeatherVane, sizeof 계산은 항상 포인터 크기에 따라 1 또는 2를 반환합니다. C에서 검사하여 int [] int int * array의 크기를 찾을 수 없습니다. 함수에 길이를 덧붙여 야합니다 (또는 센티널 값을 가짐) – pm100

답변

10
  • 는 [...] n의 값 1로서 산출한다.

글쎄, 그건 일반적인하지만 을 보장 할 수 없습니다. sizeof(int)n에 대한 2의 값을 결과, 4로 평가할 수 있습니다 동안

sizeof(ptr) 아주 잘, 귀하의 경우 가능성이 8, 발생 될 수 있습니다. 이는 사용 환경에 따라 다르며 사용 환경에 따라 다릅니다.

  • printf("Element size: %zu\n", sizeof(ptr[0]));
  • printf("Pointer size :%zu\n", sizeof(ptr));
    • 처럼 개별적으로 인쇄를 시도하고 직접 참조하십시오.

    7

    현대 플랫폼에서 포인터의 크기는 일반적으로 4 또는 8 바이트입니다.

    32 비트 플랫폼의 경우 sizeof(ptr) == 4n == 1 일 가능성이 큽니다.
    64 비트 플랫폼에서는 sizeof(ptr) == 8n == 2 일 가능성이 큽니다.