目录条目和链接列表

时间:2018-07-07 03:30:32

标签: c strcpy

这是将目录条目字符串(在这种情况下,来自根目录)放入单链接列表的代码。我不明白为什么在这样注释的行上出现段错误。我一定在做字符串复制错误吗?

我只能认为尚未保留用于字符串的空间,但是我想我已经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;
    }
}

2 个答案:

答案 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字节。您需要为每个节点中的每个目录条目分配内存,并使用指针指向该条目。

仔细查看您的代码,我不确定您要实现的目标是什么。解决内存分配问题后,您粘贴的代码将陷入无限循环。我建议您用笔和纸,逐步完成程序,以了解发生了什么。