尝试访问```list1-> data```时出现分段错误

segmentation fault when trying to access ```list1->data```

我是 C 的新手,所以这个问题听起来太简单了。

我试过 运行 这个简单的程序,但是遇到了分段错误:

struct list {
    int data;
    struct list* next;
};

void makeList(struct list* list1) {
    list1 = (struct list*) malloc(sizeof(struct list));
    list1->next = NULL;
}

int main(int argc, char ** argv) {
    struct list * list1;
    makeList(list1);
    list1->data = 5;
    printf("data: %d\n", list1->data);

    return 0;
}

我知道问题主要出在list1->data = 5,但为什么呢?

在我看来,函数 makeList 获取结构列表的指针并为其分配存储空间。那就是我所做的,不是吗?我通过指针传递了 list1。为什么它表现得像 list1 未初始化之类的?为什么不起作用?

在此声明中

struct list * list1;

声明了一个未初始化的指针,因此具有不确定的值。

在这个函数的调用中makeList

makeList(list1);

传递了指针值的副本list1。所以这个函数改变了这个值的副本而不是原始指针。 main 中声明的原始指针保持不变。

您可以通过以下方式声明和定义函数,例如

struct list * makeList( void ) 
{
    struct list *list = malloc( sizeof( struct list ) );
    if ( list != NULL ) list->next = NULL;

    return list;
}

而在 main 中,函数被调用为

list1 = makeList();

另一种方法是将main中声明的指针通过引用传递给函数。在 C 中,按引用传递意味着通过指向对象的指针间接传递对象。取消引用指针,您可以访问原始对象。

例如

void makeList( struct list **list ) 
{
    *list = malloc( sizeof( struct list ) );
    if ( *list != NULL ) ( *list )->next = NULL;
}

并且该函数被调用为

makeList( &list1 );