1

当我做:

t_node *node1;
t_node **head;
void *elem;
int c = 1;

elem = &c;
head = NULL;
node1 = malloc(sizeof(t_node));
node1->elem = elem;
head = &node1;
//add_node(node1,head); //substitute this with line above and it doesn't work
printf("%d\n",*(int*)(*head)->elem); // prints 1 and works fine

但是当我创建一个名为 ADD_NODE 的函数时它不起作用?!??!?

void add_node(t_node *node1, t_node **head){
   head = &node1;
}

这对我来说没有任何意义......为什么这会导致它不起作用?从字面上调用该函数会执行相同的代码。

编辑:请记住 add_node 的签名没有问题。我必须有那个签名

4

3 回答 3

3

在对函数的调用中,参数的作用域仅属于该函数,因此您对“head = &node1”的赋值对函数外部的变量没有影响。

要影响您传入的变量,您必须传递变量的地址。例如:

void add_node(t_node **node1, t_node ***head){
   *head = node1;
}

电话是:

add_node(&node1, &head);

请注意,您必须取消引用函数中的“head”指针,以便使用“node1”值更新“head”处的值。

于 2013-02-08T06:14:25.227 回答
3

C 是一种按值传递的语言。就相关而言,您的函数实际上根本没有做任何事情main()

在 comp.lang.c FAQ 中查看这个问题。

于 2013-02-08T06:04:34.317 回答
2

在“C”中,变量是通过引用传递的,因此要更改函数调用中的值,您应该将指针传递给变量。

正确的步骤是 -

void add_node(t_node **node1, t_node ***head){ *head = node1; }

于 2013-02-08T06:13:04.457 回答