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

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

最佳答案

具有自动存储持续时间的局部变量i的值在没有初始化的情况下使用,因此它将调用未定义的行为。通过将i替换为int i;来初始化int i = 0;
curPointerNULL中变为curPointer = curPointer->next;时,在curPointer条件下解引用curPointer->next != NULL有很大的机会导致分割错误。
尝试使用curPointer != NULL而不是curPointer->next != NULL作为条件。

关于c - 遍历链接列表时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35880357/

10-13 09:39