我正在尝试在C中实现链接列表。我相信我正在创建和正确插入元素,但每次尝试循环时都存在分段错误。这是我的链表代码:
struct node {
char **data;
struct node *next;
};
存储指向head和tail的指针的两个全局变量:
struct node *head;
struct node *tail;
插入元素的代码:
void insert(char **args)
{
struct node* pointer = (struct node*)malloc(sizeof(struct node));
pointer -> data = args;
pointer -> next = NULL;
if( head == NULL ) {
head = pointer;
tail = pointer;
}
else {
tail -> next = pointer;
tail = pointer;
}
}
然后我尝试浏览列表并打印数据内容(这会成功打印列表中的元素,但之后会出现分段错误):
int print_list(char **args)
{
struct node *curPointer = head;
if(curPointer == NULL) {
printf("%s", "List is empty\n");
}
else {
printf("%s", "List: ");
do {
int i;
while(curPointer->data[i] != NULL) {
printf("%s", tail->data[i]);
i++;
}
printf("%s", "\n");
curPointer = curPointer->next;
}while(curPointer->next != NULL);
}
return 1;
}
我的程序中依赖循环遍历列表的其他函数也存在类似的分段错误问题。
答案 0 :(得分:2)
i
的值而不进行初始化,因此它将调用未定义的行为。将i
替换为int i;
int i = 0;
curPointer
NULL
变为curPointer = curPointer->next;
时,在条件curPointer
中取消引用curPointer->next != NULL
很有可能导致分段错误。curPointer != NULL
代替curPointer->next != NULL
作为条件。