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)
为什么以及如何解决这个问题?什么是不同的崩溃?
答案 0 :(得分:4)
你说的代码真的没有用。一个主要问题是这一行
fls = (FILES*)realloc(fls, 2);
这将指针重新分配为两个字节。如果realloc
调用失败,那么这也是一个问题,因为你用NULL
覆盖了你唯一的指针,因此松开原始指针并有内存泄漏(除了解除引用NULL
指针的明显问题。
崩溃的确切原因是因为您没有为path
成员分配内存,因此您正在使用未初始化的指针。
上述两种情况都会导致未定义的行为,这是导致崩溃的常见原因。
答案 1 :(得分:1)
为FILES数组分配空间时,不会在显示的代码中为path
分配存储空间。
在代码中
strcpy(tree[i].path, "whatever")
tree[i].path
的值未定义。它可能恰好指向您可以写入或不写入的空间。
答案 2 :(得分:0)
本声明:
(FILES*)realloc(tree, sizeof(tree)*i);
为i
指针分配足够的空间,因为tree
是FILES*
。我想你想要:
(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);