在循环中使用calloc和free时,校验和不正确

时间:2015-04-20 05:18:01

标签: c++ c malloc

我在for循环中声明了一个二维数组a(m * n)。当for循环第一次运行时没有问题,但第二次它会产生错误。该计划是:

for (int j=0; j<2; j++) {
    int **a = (int**)calloc(n,sizeof(int*));
    for (int i=0; i<n; i++) {
        a[i] = (int*)calloc(m,sizeof(int));
    }
    //...some operation to a[m,n] array
    for (int i=0; i<n; i++)
        free(a[i]);
    free(a);
}

for循环第二次运行时,它会运行到包含calloc的行,并在控制台上生成以下错误:

  对象0x94a8b14的

malloc:***错误:释放的校验和不正确   对象 - 对象可能在被释放后被修改

如果我删除包含free的行,则没有区别。

2 个答案:

答案 0 :(得分:5)

int **a=(int**)calloc(n,sizeof(int*));
                      ^
for(int i=0;i<m;i++){
              ^
    a[i]=(int*)calloc(m,sizeof(int));
      ^

如果n < m,则会发生灾难性的失败。

答案 1 :(得分:2)

该行:

int **a=(int**)calloc(n,sizeof(int*));

创建一个&#39; n&#39;指向整数数组的指针。这是你的&#39; n&#39;尺寸。

下一步应该是遍历数组中的每个元素(维度&#39; n&#39;)并创建一个大小为&#39; m&#39;的数组。这将给你你的&#39; m&#39;尺寸。

你的内心循环:

for (int i=0; i<m; i++) {

实际上迭代了&#39; m&#39;你的数组大小的元素&#39; n&#39;。这是不正确的。如果您将此行更改为:

for (int i=0; i<n; i++) {

你应该避免你的内存分配错误。别忘了改变&#39; m&#39;到了&#39; n&#39;在第二个内部for循环中(释放正确的内存量)。