我有以下C程序,其中malloc是一个二维数组,并在免费部分报告
*检测到glibc * ./a.out:free():下一个尺寸无效(快):0x0000000000e05070 ***
带有回溯。
我在linux服务器上尝试了相同的代码并得到了同样的错误。但是,相同的代码完全适用于我朋友的Mac。
我想知道这是否是操作系统特定问题(例如编译器的差异)? 或者我以不恰当的方式做了一些事情但被mac OS忽略了?
# include <stdlib.h>
# define N 10
int main(){
int size = N+1;
//memory allocation
float **m = malloc((size)*sizeof(float*));
int i;
for (i=0; i<size; i++)
m[i] = malloc((size)*sizeof(float));
// ... do some work
//free
for (i=0; i<size; i++){
printf("free: %d", i);
free(m[i]);
printf(" freed.\n");
}
free(m);
printf("m freed.\n");
return 0;
}
PS:在free for循环期间,如果使用
for (i=size; i>=0; i--){...}
而不是增量版本,它实际上会在弹出相同错误之前将m [i]释放为2。 mac没有出错。
答案 0 :(得分:1)
您正在收到分段违规,因为当您的程序尝试free()
堆上已分配的所有内存时,glibc会发现内存已经无可救药地损坏。
您的示例中唯一可能发生损坏的部分是您忽略在示例中包含的部分。
因此,答案是错误是“// ...做一些工作”。如果删除所有代码,则示例将在不崩溃的情况下运行。