C 目录条目和链接列表

C 目录条目和链接列表,c,strcpy,C,Strcpy,这是将目录条目字符串(在本例中是根目录)放入单个链接列表的代码。我不明白为什么seg故障发生在被评论为这样的线路上。我一定是把字符串复制错了 我只能认为字符串的空间没有被保留,但我认为我已经通过tmp1=(struct node*)malloc(sizeof(struct node))保留了它 #包括 #包括 #包括 #包括 #包括 结构节点{ 结构导向; 结构节点*右; }; void appendnode(结构节点**,结构方向**); int main(){ DIR*d; 结构方向*d_元

这是将目录条目字符串(在本例中是根目录)放入单个链接列表的代码。我不明白为什么seg故障发生在被评论为这样的线路上。我一定是把字符串复制错了

我只能认为字符串的空间没有被保留,但我认为我已经通过
tmp1=(struct node*)malloc(sizeof(struct node))保留了它

#包括
#包括
#包括
#包括
#包括
结构节点{
结构导向;
结构节点*右;
};
void appendnode(结构节点**,结构方向**);
int main(){
DIR*d;
结构方向*d_元素;
结构节点*列表;
列表=空;
d=opendir(“C:/”);
d_ent=readdir(d);
当{
附录节点(列表和数据);
d_ent=readdir(d);
}
getchar();
返回0;
}
void appendnode(结构节点**q,结构方向**r){
结构节点*tmp1,*tmp2;
tmp1=(结构节点*)malloc(sizeof(结构节点));
strcpy(tmp1->ent->d_name,(*r)->d_name);//右=NULL;
如果(!*q){
*q=tmp1;
}否则{
tmp2=*q;
同时(tmp2->右侧){
tmp2=tmp2->右侧;
}
tmp2->right=tmp1;
}
}
在调用malloc之前打印sizeof(struct节点),看看它显示了多少。这里要做的是为指向struct dirent的指针和指向struct节点的指针分配内存。根据您运行的系统,每个指针的大小为4字节或8字节。您需要为每个节点中的每个目录条目分配内存,并使用指针指向该条目


仔细看看你的代码,我不确定你想要实现什么。修复内存分配问题后,粘贴的代码将卡在无限循环中。我建议你拿一支笔和一张纸,逐步了解程序发生了什么。

你遇到了分段错误,因为你试图访问一个未初始化的指针
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);
}

tmp1
包含指向由
malloc()
返回的统一化内存的指针。当评估
tmp1->ent
时,访问其值会产生未定义的行为。评估
tmp1->ent
是为了评估
tmp1->ent->d_name
,然后将其传递到
strcpy()
。净效果是,
strcpy()
被传递了一个错误的指针,并写入其中。Handy链接,请参见:嗯,我看不出存在无限循环?您尝试过调试它吗?你的计划完成了吗?此外,请参见“是”,它已完成。我写这篇文章不是为了取得任何成就。
tmp1->ent = malloc(sizeof(struct dirent));
if (tmp1->ent == NULL) {
    fprintf (stderr, "Failed to allocate memory");
    exit(EXIT_FAILURE);
}
if (tmp1 == NULL) {
    fprintf (stderr, "Failed to allocate memory");
    exit(EXIT_FAILURE);
}