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