我有以下 C 程序,它分配一个二维数组,并在空闲部分报告
* 检测到 glibc * ./a.out: free(): 下一个大小无效(快速): 0x0000000000e05070 ***
带有回溯。
我在 Linux 服务器上尝试了相同的代码并得到了相同的错误。然而,相同的代码在我 friend 的 Mac 上运行得很好。
我想知道这是否是操作系统特定的问题(例如编译器的差异)? 或者我做了一些不恰当的事情但被 macOS 忽略了?
# 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 没有出现任何问题。
最佳答案
您遇到了分段冲突,因为当您的程序尝试free()
堆上分配的所有内存时,glibc 发现内存已被无可救药地损坏。
示例中唯一可能发生损坏的部分是您忽略包含在示例中的部分。
因此,答案是该错误是“//... Do some work”。如果删除所有这些代码,您的示例将运行而不会崩溃。
关于Linux 上的 C free() 报告无效的下一个大小错误、数组指针、Mac 上的相同代码传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26208030/