反复调用calloc似乎破坏了之前调用的数据

时间:2017-03-17 11:06:51

标签: c dynamic-memory-allocation calloc

我有以下代码,它应该使用calloc分配宽度和高度imageWidth的二维数组(它适用于玩具四叉树构建程序)。第三个调试打印是跟踪循环过程中图像[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()。当我得到奇怪的结果时,它们不会被输入。

谢谢!

1 个答案:

答案 0 :(得分:4)

第一个分配应该是:

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

因为你正在分配“imageWidth”指针数,而不是那个字节数。