奇怪的段错误发生

时间:2014-03-17 19:19:11

标签: c segmentation-fault

typedef struct  
{
    char path[MAX_FILENAME*MAX_FOLDERS];
    char filename[MAX_FILENAME];
    time_t date;
    off_t size;
} FILES;

此代码有效

FILES *fls = (FILES*)malloc(sizeof(FILES));
    strcpy(fls[0].filename, "asd");
    printf("%s\n", fls[0].filename);
    fls = (FILES*)realloc(fls, 2);
    strcpy(fls[1].filename, "asdfgh");
    printf("%s\n", fls[0].filename);
    printf("%s\n", fls[1].filename);

但是在这里:

void allocateFileTree(FILES *tree,int i)
{
    if(i==0)
      tree = (FILES*)malloc(sizeof(FILES));
    else
      tree = (FILES*)realloc(tree, sizeof(FILES)*i);      

}

循环

allocateFileTree(tree, i);
struct stat buff;
stat(entry -> d_name, &buff);

strcpy(tree[i].path, "whatever");//it gives segfault
i++;//this is never executed so realloc isn't the problem (yet)

为什么以及如何解决这个问题?什么是不同的崩溃?

3 个答案:

答案 0 :(得分:4)

你说的代码真的没有用。一个主要问题是这一行

fls = (FILES*)realloc(fls, 2);

这将指针重新分配为两个字节。如果realloc调用失败,那么这也是一个问题,因为你用NULL覆盖了你唯一的指针,因此松开原始指针并有内存泄漏(除了解除引用NULL指针的明显问题。

崩溃的确切原因是因为您没有为path成员分配内存,因此您正在使用未初始化的指针。

上述两种情况都会导致未定义的行为,这是导致崩溃的常见原因。

最后,在C中你should not cast the return of malloc (and family)

答案 1 :(得分:1)

为FILES数组分配空间时,不会在显示的代码中为path分配存储空间。

在代码中

strcpy(tree[i].path, "whatever")

tree[i].path的值未定义。它可能恰好指向您可以写入或不写入的空间。

答案 2 :(得分:0)

本声明:

(FILES*)realloc(tree, sizeof(tree)*i);

i指针分配足够的空间,因为treeFILES*。我想你想要:

(FILES*)realloc(tree, sizeof(*tree)*i);

你的另一个问题是你从未真正更新树指针。 allocateFileTree()函数只会更新它的指向新分配的指针的本地副本。

您可能想尝试类似

的内容
FILES* allocateFileTree(FILES *tree,int i)
{
    if(i==0)
      tree = (FILES*)malloc(sizeof(FILES));
    else
      tree = (FILES*)realloc(tree, sizeof(FILES)*i);      

    return tree;
}

并称之为:

tree = allocateFileTree(tree, i);