повторный вызов calloc, кажется, повреждает данные из предыдущих вызовов

У меня есть следующий код, который должен выделять 2d-массив ширины и высоты imageWidth с помощью calloc (это для игрушечной программы построения quadtree, как это происходит). третья отладочная печать предназначена для отслеживания того, что происходит в массивах от изображения [0] до [10] по мере прохождения цикла.

/* 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

но установка imageWidth на 29 дает что-то вроде

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(). они не вводятся, когда я получаю странные результаты.

Спасибо!


person Matt Creighton    schedule 17.03.2017    source источник
comment
calloc(imageWidth, 1) выделять imageWidth char*s неправильно; вам нужно sizeof(char*) вместо 1.   -  person Ry-♦    schedule 17.03.2017


Ответы (1)


Первое распределение должно быть:

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

потому что вы выделяете количество указателей "imageWidth", а не это количество байтов.

person M.M    schedule 17.03.2017