C - 2D阵列malloc / free - 分段错误

时间:2015-04-09 22:23:21

标签: c arrays segmentation-fault malloc free

下面有一个非常简单的代码片段,我试图找出导致分段错误的原因。

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错误。但我认为这会导致泄密。

非常感谢任何帮助。

2 个答案:

答案 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';
        }