【问题标题】:Proper way to modify a linked list item in C在C中修改链表项的正确方法
【发布时间】:2026-02-04 19:00:01
【问题描述】:

我正在使用 C 中的链表,并试图了解将节点传递给函数并修改该节点值的正确方法。

为了这些示例,假设我有一个单节点列表并且只关心修改第一个节点。

struct node {
    int value;
    struct node *next
};

在 main 我声明我的(单节点)列表:

int main(){ 
    struct node *first;
    first = malloc(sizeof(struct node));
    first->value = 5;
    first->next  = NULL;
    //someFunctA(first);
    //someFunctB(&first);
};

要在函数中修改first->value,我应该使用:

void someFunctA(struct node *modify){
    modify->value = 10;}

或:

void someFunctB(struct node **modify){
    struct node *temp = *modify;
    temp->value = 10;}

(或者两者都不是?)

似乎都可以工作 - 在调用 someFunctA(home)someFunctB(&home) 之后,我在调用它们后在 main() 中看到了 first->value 中的预期值(在这种情况下为 10)。

这些方法是否正确?两个都?如果两者都有,两者之间的取舍是什么?

另外,是否可以使用引用指针传递first(如someFunctB,对吗?)并且仍然可以直接处理它而不制作副本? (当我使用引用指针传递并尝试访问函数中的modify->value*modify->value**modify->value 时,我收到错误request for member ‘value’ in something not a structure or union。)

【问题讨论】:

  • 如果函数需要修改数据但不需要在列表本身上工作,它可能不应该使用列表节点......它可能应该只使用指向数据的指针,或返回要在函数外部分配的新值。那么void someFuncA(int *val) { *val = 10; } 被称为someFuncA(&first->value); 怎么样?

标签: c pointers linked-list parameter-passing


【解决方案1】:

是的,这两种方法都可以,但您可能需要第一个版本。您正在传递一个指向节点的指针,以便您的函数能够修改节点本身。第二个版本使您能够修改指针(即main() 中的变量first),但如果您不需要这样做,则没有理由使用第二个选项。

关于你在第二个函数中直接使用modify的问题,正确的语法是(*modify)->value = 10

【讨论】: