2012-10-04 3 views
0

가능한 중복 :
How to get the size of dynamically allocated 2d array인쇄 배열 기능 첫 번째 요소

나는 내가 잘못 여기에 무슨 짓을 찾을 수 없습니다. 그 크기가 사용자 입력을 기반으로 배열을 만들고, 사용자 입력에서 배열에 대한 데이터 (정수)를 얻고, 배열 정수를 인쇄하고 싶습니다.

문제는 첫 번째 배열 요소 (예 : intArr[0]) 만 인쇄한다는 것입니다.

int main() 
{ 
    int i, n, *intArr; 

    printf("Type the array size:\t"); 
    scanf("%d", &n); 

    intArr = (int *)malloc(n * sizeof(int)); 

    for (i = 0; i < n; ++i) 
    { 
     printf("Type a number\t"); 
     scanf("%d", intArr + i); 
    } 

    printArr(intArr); 
} 

void printArr(int *arr) 
{ 
    int i; 
    for (i = 0; i < (sizeof(arr)/sizeof(*arr)); ++i) 
     printf("%d ", *(arr + i)); 
} 
+0

이 질문도 관련성이 있습니다. [** sizeof (배열을 가리키는 포인터)를 찾는 방법 **] (http://stackoverflow.com/questions/492384/how-to-find-the- sizeofa-pointer-pointing-to-an-array) - 포인터를 가리키는 포인터의 크기를 알아내는 것이 불가능하다는 것을 몰랐습니다. – tempy

답변

3

arr의 종류는 매우 int*sizeof(arr)arr 요소의 sizeof(int*)하지 수있을 것이다. 시스템에서 sizeof(int*)sizeof(int)은 동일하므로 결과로 1을 주므로 루프는 하나의 요소 만 인쇄합니다.

printArr() 함수의 인수로 요소 수를 전달하십시오.

참고 : malloc() D를 가지고있는

  • free().
  • 캐스팅 리턴 값 malloc()이 필요하지 않습니다.
  • 성공을 위해 scanf()의 확인 값을 확인하십시오.
+1

'main()'의'sizeof (arr)'이 배열의 크기를 반환하는 이유를 설명 할 수 있습니까?하지만'printArr()'에 전달하면 배열의 크기를 얻을 수 없습니까? 그것이 배열의 첫 번째 요소를 가리키고 있기 때문에해야한다고 생각했습니다. – tempy

+1

게시 된 코드는'main()'에서'sizeof()'를 사용하지 않습니다.배열이 함수에 전달되면, 첫 번째 요소에 대한 포인터로 붕괴되므로 인수의 유형은'T *'입니다. 여기서'T '는 배열 요소의 유형입니다. 하나의'T' 또는'T'의 배열을 가리키는지를 나타 내기 위해 포인터 변수에 저장된 추가 정보가 없습니다. – hmjd

1

배열을 함수로 포인터로 전달할 수 없으므로 배열이 첫 번째 요소에 대한 포인터로 붕괴 할 때 크기에 대한 정보가 손실됩니다.

추가, 명시 적 인수로 크기를 전달하십시오.

+0

왜이 정보가 손실됩니까? 이것은 내가 얻지 못하는 것이다. 배열의 첫 번째 요소에 대한 포인터임을 인식 할 것이라고 생각했습니다. – tempy

0

printArr() 함수에 인수의 수를 전달하지 않으므로이를 알 수있는 방법이 없습니다. 다른 매개 변수로 요소 수를 전달합니다.

"arr"유형은 정수에 대한 포인터입니다. 대부분 컴퓨터 아키텍처에 따라 4 바이트입니다. "* arr"과 같은 크기입니다.

printf("%d \n", (int) sizeof(arr)); 
printf("%d \n", (int) sizeof(*arr)); 
printf("%d \n", (int) sizeof(arr)/sizeof(*arr)); 

과 같은 출력을 볼 것입니다 :

당신은 시도 할 수

4 
4 
1 

따라서 한 번만 인쇄 루프를 실행하는 운명.

+1

'% d '은'int'를위한 것이지만'size_t'를 보냅니다. "int"에 캐스트를 사용하거나'% zu'를 사용하십시오. –

+0

@AlexeyFrunze - 좋은 지적입니다. 관련된 값들에 대해서는이 점이 변하지 않았지만, 알렉세이가 제안한 바와 같이 양질의 코드를 위해 타입을 사용해야한다. 그에 따라 내 대답을 편집 할 것입니다. – elomage

+0

@AlexeyFrunze'% zu'은 무엇입니까? – tempy