遍历链表时的分段错误

时间:2016-03-08 23:51:02

标签: c linked-list

我正在尝试在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;
}

我的程序中依赖循环遍历列表的其他函数也存在类似的分段错误问题。

1 个答案:

答案 0 :(得分:2)

  • 使用具有自动存储持续时间的局部变量i的值而不进行初始化,因此它将调用未定义的行为。将i替换为int i;
  • 初始化int i = 0;
  • curPointer NULL变为curPointer = curPointer->next;时,在条件curPointer中取消引用curPointer->next != NULL很有可能导致分段错误。
    请尝试使用curPointer != NULL代替curPointer->next != NULL作为条件。