我在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
的行,则没有区别。
答案 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循环中(释放正确的内存量)。