这是将目录条目字符串(在这种情况下,来自根目录)放入单链接列表的代码。我不明白为什么在这样注释的行上出现段错误。我一定在做字符串复制错误吗?
我只能认为尚未保留用于字符串的空间,但是我想我已经tmp1 = (struct node *)malloc(sizeof(struct node));
保留了它?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
struct node {
struct dirent *ent;
struct node *right;
};
void appendnode(struct node **, struct dirent **);
int main() {
DIR *d;
struct dirent *d_ent;
struct node *list;
list = NULL;
d = opendir("C:/");
d_ent = readdir(d);
while (d_ent) {
appendnode(&list, &d_ent);
d_ent = readdir(d);
}
getchar();
return 0;
}
void appendnode(struct node **q, struct dirent **r) {
struct node *tmp1, *tmp2;
tmp1 = (struct node *)malloc(sizeof(struct node));
strcpy(tmp1 -> ent -> d_name, (*r) -> d_name); // <-- Causes seg fault. Why?
tmp1 -> right = NULL;
if (!*q) {
*q = tmp1;
} else {
tmp2 = *q;
while (tmp2 -> right) {
tmp2 = tmp2 -> right;
}
tmp2 -> right = tmp1;
}
}
答案 0 :(得分:1)
由于尝试访问未初始化的指针tmp1->ent
,因此出现分段错误:
strcpy(tmp1 -> ent -> d_name, (*r) -> d_name);
^^^
在为tmp1
分配内存之后,您也应该为tmp1->ent
分配内存
tmp1->ent = malloc(sizeof(struct dirent));
if (tmp1->ent == NULL) {
fprintf (stderr, "Failed to allocate memory");
exit(EXIT_FAILURE);
}
此外,您无需强制转换malloc
。遵循良好的编程习惯,请始终检查指向尝试分配内存的指针的NULL
。你应该做
if (tmp1 == NULL) {
fprintf (stderr, "Failed to allocate memory");
exit(EXIT_FAILURE);
}
答案 1 :(得分:0)
struct node {
struct dirent *ent;
struct node *right;
};
tmp1 = (struct node *)malloc(sizeof(struct node));
在调用malloc之前打印sizeof(结构节点),并查看显示了多少。您在这里所做的是为 pointer 分配内存以构造Dirent,为 pointer 分配struct节点。根据运行的系统,每个指针的大小为4字节或8字节。您需要为每个节点中的每个目录条目分配内存,并使用指针指向该条目。
仔细查看您的代码,我不确定您要实现的目标是什么。解决内存分配问题后,您粘贴的代码将陷入无限循环。我建议您用笔和纸,逐步完成程序,以了解发生了什么。