c没有二维数组给出了分段错误

时间:2014-02-19 20:50:27

标签: c segmentation-fault malloc free

有人可以解释一下free(test[0])给我一个segmentation fault (core dumped)的方式吗?我试图注释掉free,然后程序正确终止(除了丢失的内存)。另外,如果我注释掉test[0] = "abcd"并再次插入free(...),它也会正确终止!?

char **test = (char**) (malloc(sizeof(char*) * 5));
for (int i=0; i<5; i++) {
  test[i] = (char*) (malloc(sizeof(char*) * 5));
}

test[0] = "abcd";
free(test[0]);

3 个答案:

答案 0 :(得分:4)

使用strcpy而不是==,因为在这里,你只需给test [0]一个静态链“abcd”的地址,不能像那样解除分配。

答案 1 :(得分:1)

请参阅@ Fvirtman的答案以解决您的崩溃问题。

然后防止泄漏:

test是一个二维数组,所以你需要首先释放它的每个子数组,然后像这样自由测试:

for (int i=0; i<5; i++) {
  free(test[i]);
}
free(test);

答案 2 :(得分:0)

用地址test[0]覆盖指针"abcd",这是静态分配的数据,位于只读区域。在printf("%p",test[0]);之前和之后添加此test[0] = "abcd";,以便对可能发生的事情进行可视化。