C - 将文件读取到双向链接列表得到分段错误

时间:2016-05-10 07:54:18

标签: c linked-list doubly-linked-list

我正在从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;
}

2 个答案:

答案 0 :(得分:2)

//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成员。

答案 1 :(得分:0)

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