我正在尝试用C实现链表。我相信我正在正确创建和插入元素,但是每次我尝试循环时都会出现分段错误。这是我的链表代码:
struct node {
char **data;
struct node *next;
};
两个全局变量来存储指向头部和尾部的指针:
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 emptyn");
}
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;
}
我的程序中依赖于循环列表的其他函数也有类似的分段错误问题。
- 具有自动存储持续时间的局部变量
i
的值无需初始化即可使用,因此它将调用未定义的行为。通过将int i;
替换为int i = 0;
来初始化i
- 当
curPointer
在curPointer = curPointer->next;
中变得NULL
时,取消引用curPointer
curPointer->next != NULL
有很大的几率导致分段错误。
尝试使用curPointer != NULL
而不是curPointer->next != NULL
来治疗这种情况。