传递双指针和指向函数的指针时出现分段错误

时间:2013-02-08 05:53:38

标签: c pointers singly-linked-list

当我这样做时:

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的签名不会受到质疑。我需要有这个签名

3 个答案:

答案 0 :(得分:3)

C是一种按值传递的语言。就main()而言,你的功能实际上根本没有做任何事情。

在comp.lang.c常见问题解答中查看this question

答案 1 :(得分:3)

在对函数的调用中,参数的范围仅为该函数的范围,因此“head =& node1”的赋值对函数外部的变量没有影响。

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

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

,电话会是:

add_node(&node1, &head);

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

答案 2 :(得分:2)

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

正确的步骤是 -

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