我正在从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;
}
答案 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()分配内存。