gpt4 book ai didi

c - 尝试获取文件名长度时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:21:25 24 4
gpt4 key购买 nike

我已将段错误缩小到导致它的特定代码行。这是一个简单的示例,显示了我遇到的问题。

int main()
{
char** files;
int sum;
int i;

DIR *d;
struct dirent *dir;
d = opendir(".");
if (d)
{
sum = file_sum();
char* files[sum];
i = 0;

while ((dir = readdir(d)) != NULL)
{
files[i] = dir->d_name;
i++;
}

closedir(d);
}
else
{
return -1;
}

int len = strlen(files[0]); /*segmentation fault here*/

return 0;
}

本质上,该程序所做的是从当前目录中获取所有文件的名称并将它们放入一个数组中。然后我将尝试获取所有文件名的大小,但我遇到了段错误。我的理论是,也许文件名不是以 null 结尾的?如果这是真的,我不确定是否有解决方法,但我们将不胜感激。

谢谢

编辑:抱歉,我在这里出错了。段错误仅在我尝试存储 strlen 返回值时发生,因为我现在已将代码更改为上面

最佳答案

在您的 if block 中,您定义了一个名为 files 的变量。这会在函数顶部屏蔽同名变量。 不是在更高范围内指定数组的大小,这似乎是您的意图。因此,当您退出 if block 时,内部 files 超出范围,并且外部 files 未初始化。然后取消引用未初始化的指针,导致核心转储。

您要做的是在 if block 中为您需要的内存动态分配必要的内存。

此外,检索到 dir->d_name 的目录名称可能会在每次调用 readdir 时被覆盖,因此您也需要为其分配空间。

编辑:

您也不需要单独的函数来获取文件计数。您可以使用默认大小和 realloc 分配数组以根据需要扩展:

int main()
{
char** files;
int sum;
int i;

DIR *d;
struct dirent *dir;
d = opendir(".");
if (d)
{
int size = 10;
sum = 0;
files = malloc(size * sizeof(char *)); // allocate the array
if (files == NULL) {
perror("malloc failed");
exit(1);
}

while ((dir = readdir(d)) != NULL)
{
if (sum >= size) {
// if the array is full, realloc twice the size
char **tmp;
size *= 2;
tmp = realloc(size * sizeof(char *));
if (tmp == NULL) {
perror("realloc failed");
exit(1);
}
files = tmp;
}
files[sum] = strdup(dir->d_name); // allocate and copy each string
sum++;
}

closedir(d);
}
else
{
return -1;
}

strlen(files[0]);

// free the individual strings
for (i=0; i<sum; i++) {
free(files[i]);
}
// free the array
free(files);

return 0;
}

关于c - 尝试获取文件名长度时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34142909/

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