下面有一个非常简单的代码片段,我试图找出导致分段错误的原因。
int main (int argc, char** argv)
{
const int size = 2;
char** test1 = NULL;
int index = 0;
test1=(char**)malloc(sizeof(char*) * size);
if (test1 != NULL)
{
for (index = 0; index < size ; index++)
{
test1[index]=(char*)malloc(sizeof(char));
test1[index]='a';
}
//Removing this block does not result in seg fault - start
for (index = 0 ; index < size ; index++)
{
free(test1[index]); //Seg. fault here
}
//Removing this block does not result in seg fault - end
free(test1);
}
return 0;
}
如果我删除了开始和结束注释中包含的块 - 我没有看到seg错误。但我认为这会导致泄密。
非常感谢任何帮助。
答案 0 :(得分:0)
我认为你打算取消引用test1 [index]。你的代码用'a'覆盖分配的内存的地址,因此当它试图释放内存时它会因为'a'不是有效的地址而导致故障。
test1[index]=(char*)malloc(sizeof(char));
*test1[index]='a';
这也适用
test1[index][0]='a';
答案 1 :(得分:0)
你开始很好:
test1=(char**)malloc(sizeof(char*) * size);
if (test1 != NULL) {
你的循环不是:
for (index = 0; index < size ; index++) {
test1[index]=(char*)malloc(sizeof(char));
test1[index]='a';
}
首先,你只为一行字符分配一个字节(因为你只有一个&#34; size&#34;变量,我假设你希望你的二维数组是正方形:2x2。所以你需要像在外循环中那样乘以大小。你不需要&#34; sizeof(char)&#34;,这只是一个长期打字的方式&#34; 1&#34;。
但是比这更糟糕的是,在将行分配得太短之后,你会通过用一个字符覆盖指针来抛弃那个内存(你应该在这里得到一个编译器警告)。那场灾难等待发生,内存泄漏。
你的真正含义是:
for (index = 0; index < size ; index++) {
test1[index]=malloc(size);
test1[index][0]='a';
}