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

C - Read file to Doubly Linked List got segmentation fault

我正在从 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;
}
//Do I need this line?
//aList = (TelephoneBookList*) malloc(aList->size + 1) * sizeof aList);

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

if (aList->head == NULL) {

将取消引用空指针。

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

正确的行应该是

aList = malloc(sizeof *aList);

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

分配列表结构。然后将其初始化为空。并且不要忘记初始化 size 成员。

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