【问题标题】:Segmentation fault when passing double pointer and pointer to function将双指针和指针传递给函数时出现分段错误
【发布时间】:2013-02-08 05:53:38
【问题描述】:

当我这样做时:

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 的签名没有问题。我必须有那个签名

【问题讨论】:

    标签: c pointers singly-linked-list


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      电话会是:

      add_node(&node1, &head);
      

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

      【讨论】:

        【解决方案3】:

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

        正确的步骤是 -

        void add_node(t_node **node1, t_node ***head){ *头=节点1; }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-05
          • 2018-07-20
          相关资源
          最近更新 更多