gpt4 book ai didi

c - 尝试创建目录结构数组时出现段错误/不兼容类型错误

转载 作者:行者123 更新时间:2023-11-30 21:27:10 26 4
gpt4 key购买 nike

我正在使用 dirent.h 库扫描目录中包含的所有文件,并将指向结果对象的指针存储在数组中。我一直在关注这个old SO question描述了数组中结构指针的存储,但我在实现过程中遇到了问题。

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>

int main(int argc, char **argv)
{
DIR *d = NULL;
struct dirent *dir = NULL;
struct dirent *d_array[50]; //big overkill array to avoid realloc
size_t n = 0; //number of items

d = opendir("scandir"); //name of directory to search
if(d)
{
while((dir = readdir(d))!=NULL) {
//d_array[n] = malloc(sizeof(struct dirent));
d_array[n++] = dir;
}
closedir(d);
}
for(size_t i = 0;i<n;i++) {
printf(d_array[n]->d_name);
free(d_array[n]);
}
free(d_array);
return 0;
}

运行上述代码会导致段错误:11。我认为这可能是因为我正确地为结构分配了内存(如注释掉的 malloc 中所示),但包括它会产生以下错误:

error: assigning to 'struct dirent *' from incompatible type
'void *'

我不明白为什么d_array[n] = malloc(sizeof(struct dirent))(逐字来自有关此主题的多篇文章)会出现这种不兼容的类型错误。如果使用不合适,为什么我会出现段错误?

最佳答案

Running the above code results in a Segmentation fault: 11.

这可能是因为

    printf(d_array[n]->d_name);

    free(d_array[n]);

,因为n是目录条目数,d_array[n]未初始化。 (您的意思似乎是 d_array[i] )还要注意,您不应尝试释放 readdir() 返回的指针。 ,因为它不属于您。该文档特别指出您不应尝试释放它。这可能适用于您将指针本身分配给数组的版本。

也可能是因为

free(d_array);

,自 d_array本身不是动态分配的。您可以合理地希望您的编译器会对此发出警告。我的就是这样。

I don't understand why d_array[n] = malloc(sizeof(struct dirent)), which is verbatim from multiple posts about this topic, is having this incompatible type error.

那是因为您的编译器不符合标准。也许您使用的是 C++ 编译器而不是 C 编译器——它们是不可互换的。该语句是完全有效的 C 语言,因为声明位于它出现在代码中的范围内。

附录:至于你实际应该做什么,如果你要动态地为 d_array 的元素分配内存以指向(并且你应该,如果你使用指针数组)那么你需要复制指向的 -至 struct dirent将结构体放入分配的空间中,而不是将返回的指针直接分配给数组。那将是

    *d_array[i] = *dir;

正如保罗·奥格维在现已删除的答案中首先指出的那样。

关于c - 尝试创建目录结构数组时出现段错误/不兼容类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53638222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com