Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-将文件读取到双链表时出现分段错误_C_Linked List_Doubly Linked List - Fatal编程技术网

C-将文件读取到双链表时出现分段错误

C-将文件读取到双链表时出现分段错误,c,linked-list,doubly-linked-list,C,Linked List,Doubly Linked List,我正在将txt文件读入一个双链接列表。代码可以将数据存储到节点中,但当我让它通过链表时,它出现了分段错误 你们能告诉我代码出了什么问题吗,谢谢 这是数据结构: typedef struct telephoneBookNode { int id; char name[NAME_LENGTH]; char telephone[TELEPHONE_LENGTH]; struct telephoneBookNode * previousNode; struct t

我正在将
txt
文件读入一个双链接列表。代码可以将数据存储到节点中,但当我让它通过链表时,它出现了分段错误

你们能告诉我代码出了什么问题吗,谢谢

这是数据结构:

typedef struct telephoneBookNode {
    int id;
    char name[NAME_LENGTH];
    char telephone[TELEPHONE_LENGTH];
    struct telephoneBookNode * previousNode;
    struct telephoneBookNode * nextNode;
} TelephoneBookNode;

typedef struct telephoneBookList {
    TelephoneBookNode * head;
    TelephoneBookNode * tail;
    TelephoneBookNode * current;
    unsigned size;
} TelephoneBookList;
以下是创建链接列表的代码:

TelephoneBookList * createTelephoneBookList(char entry[]) {
    TelephoneBookList* aList = NULL;
    TelephoneBookNode* aNode = NULL;
    char *tokens;

    TelephoneBookNode *(*create)() = createTelephoneBookNode;
    aNode = (*create)();

    tokens = strtok(entry, ", ");
    aNode->id = atoi(tokens);

    tokens = strtok(NULL, ", ");
    strcpy(aNode->name, tokens);

    tokens = strtok(NULL, ", ");
    strcpy(aNode->telephone, tokens); //Fine until here

    //Do I need this line?
    //aList = (TelephoneBookList*) malloc(aList->size + 1) * sizeof aList);

    if (aList->head == NULL) {
        aNode->nextNode = NULL;
        aNode->previousNode = NULL;

        aList->current = aNode;
        aList->head = aNode;
        aList->tail = aNode;
    } else {
        aList->tail->nextNode = aNode;
        aNode->previousNode = aList->tail;
    }
    return aList;
}

TelephoneBookNode * createTelephoneBookNode() {
    TelephoneBookNode* aNode;

    aNode = (TelephoneBookNode*) malloc(sizeof *aNode);
    return aNode;
}
对。是的,你需要那条线。否则,下一行

if (aList->head == NULL) {
将取消对空指针的引用

虽然您已经在注释掉的
malloc
调用中这样做了,但是使用
aList->size+1
取消对空指针的引用

正确的行应该是

aList = malloc(sizeof *aList);

由于您在函数中从头开始创建列表,因此无需检查它是否为空,它将始终为空。更重要的是,
malloc
调用不会初始化它分配的内存,因此使用该内存(例如在
aList->head==NULL
之类的表达式中)将导致未定义的行为

分配列表结构。然后初始化它,就好像它是空的一样。不要忘记初始化
大小
成员

对。是的,你需要那条线。否则,下一行

if (aList->head == NULL) {
将取消对空指针的引用

虽然您已经在注释掉的
malloc
调用中这样做了,但是使用
aList->size+1
取消对空指针的引用

正确的行应该是

aList = malloc(sizeof *aList);

由于您在函数中从头开始创建列表,因此无需检查它是否为空,它将始终为空。更重要的是,
malloc
调用不会初始化它分配的内存,因此使用该内存(例如在
aList->head==NULL
之类的表达式中)将导致未定义的行为


分配列表结构。然后初始化它,就好像它是空的一样。另外,不要忘记初始化
大小
成员。

您的
createTelephoneBookNode
函数不会初始化它创建的节点。malloc()为其分配一个可能没有用零初始化的内存块,因此,nextNode和previousNode指针包含垃圾。要么将它们都设置为NULL,要么使用calloc()分配内存。

您的
createTelephoneBookNode
函数不会初始化它创建的节点。malloc()为其分配一个可能没有用零初始化的内存块,因此,nextNode和previousNode指针包含垃圾。要么将它们都设置为NULL,要么使用calloc()分配内存。

注意,即使使用这一行,malloc()也不会将aList->head初始化为NULL,甚至引用其值也是未定义的行为。您可能正在寻找的是calloc()。请注意,即使使用这一行,malloc()也不会将aList->head初始化为NULL,甚至引用其值也是未定义的行为。calloc()可能就是您要寻找的。