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()可能就是您要寻找的。