2017-03-17 17 views
0

다음 코드는 calloc을 사용하여 width 및 height imageWidth의 2 차원 배열을 할당해야합니다 (장난감 쿼드 트리 작성 프로그램의 경우 발생). 세 번째 디버그 인쇄는 루프가 진행됨에 따라 [0]에서 [10] 이미지의 배열에서 일어나는 일을 추적하는 것입니다.calloc을 반복적으로 호출하면 이전 호출의 데이터가 손상된 것으로 보입니다

/* allocate pointer array memory */ 
char** image = calloc (imageWidth, 1); 
if (image == NULL) errMalloc(); 

/* fill with a series of char arrays */ 
for (i = 0; i < imageWidth; i++) { 
    image[i] = calloc (imageWidth, 1); 
    if (image[i] == NULL) errMalloc(); 

    /* debug prints */ 
    printf("%d ", i); 
    printf("%d ", image[i][0]); 
    printf("%d\n", image[i%10][0]); 
} 

이미지의 폭보다 작은 경우 ~ 20 (16 말), 난,

0 0 0 
1 0 0 
2 0 0 
etc... 
15 0 0 

하지만 뭔가를 기대 인쇄물을 얻을 수 29 IMAGEWIDTH를 설정하면 제공 뭔가

0 0 0 
1 0 0 
etc... 
9 0 0 
10 0 16 //value at image [0][0] has changed 
11 0 0 
etc... 
19 0 0 
20 0 16 
21 0 -96 // now value at image[1][0] has changed 
22 0 0 
etc.. 
27 0 0 
28 0 0 

같은 무엇이 이것을 일으킬 수 있습니까? 나는 calloc이 다시 호출 될 때 다른 메모리의 값을 변경한다는 것을 매우 의심한다. 그래서 에러는 내 코드에 있어야한다. 유용한 경우 두 개의 if 문은 단순히 puts() 및 exit()로 연결됩니다. 이상한 결과가 나올 때 입력되지 않습니다.

감사합니다.

+2

'imageWidth'를 할당하기위한'calloc (imageWidth, 1)''char *'s가 잘못되었습니다; '1' 대신'sizeof (char *)'가 필요합니다. – Ryan

답변

4

첫 번째 할당해야한다 :

char** image = calloc (imageWidth, sizeof *image); 

당신은 포인터의 "IMAGEWIDTH"수, 바이트하지 그 번호를 할당 때문이다.

+0

Doh! 고전적인 실수. +1하고 수락 함 –