为什么在函数中不能覆盖结构的指针?

问题描述

让我们看一下这段代码

typedef struct nodes{
    int val;
    struct nodes next;
} node;

insertHead(node *list,int val) {
    node *temp = malloc(sizeof(node));
    temp->val;
    temp->next = list;
    list = temp;
}

int main() {
    node *list = NULL;
    insert(list,5);
}

如果我尝试调用list->val,它将无法正常工作,就好像它传递了列表的副本并且没有真正设置列表的新标题一样。

typedef struct nodes{
    int val;
    struct nodes next;
} node;

insertHead(node **list,int val) {
    node *temp = malloc(sizeof(node));
    temp->val;
    temp->next = *list;
    *list = temp;
}

int main() {
    node *list = NULL;
    insert(&list,5);
}

我知道这会起作用,但是我的实际问题是为什么第一个示例不起作用。我的意思是我将list传递给函数,而list是指向结构的指针。我是C的新手,但传入结构的地址来更改其成员并覆盖它可能不正确。我完全理解,如果我用*list传递结构本身,这将不起作用,因为它只会创建一个副本。 但是node *list不是副本,它是指向实际结构的指针,那么为什么我需要使用指向结构的指针?

P.S:我是C的新手,所以不要太刻薄。这将是一个链接列表。

解决方法

因为您要修改指针本身,而不是引用的值。要对其进行修改,您需要将指针传递给该指针

类似于“普通”类型。如果传递整数,则无法在函数中对其进行修改。要存档,您需要传递指针。