将指向struct的指针设置为等于函数返回的另一个指向struct的指针?

时间:2016-12-26 02:04:55

标签: c pointers struct segmentation-fault

我正在尝试构建链接列表但由于某种原因我的头部未正确更新。以下是我的代码片段无法正常工作:

typedef struct node {
  int data;
  struct node *next;
} * node;

node create_node(int data) {
  node to_return = calloc(1, sizeof(struct node));
  to_return->data = data;
  to_return->next = NULL;
  return to_return;
}

int insert(int data, node head) {
  if (head == NULL) {
    head = create_node(data);
  }
  .
  .
  .
  }
  return 1;
}

int main(int argc, char **argv) {

  node head = NULL;
  insert(1, head);

  printf("head->data: %d", head->data);
}

在这个例子中,我尝试使用insert()创建链表的第一个节点。但是,我收到SEG错误,这意味着create_node()返回的to_return节点指针没有正确设置到insert()中的节点头。我在这里错过了什么?

编辑:我仔细检查并在insert()中正确设置了头部。由于某种原因,这些变化不会持续存在

2 个答案:

答案 0 :(得分:3)

将指针传递给节点:

int insert(int data, node* head) {
  if (*head == NULL) {
    *head = create_node(data);
  }
  .
  .
  .
  }
  return 1;
}

int main(int argc, char **argv) {

  node head = NULL;
  insert(1, &head);

  printf("head->data: %d", head->data);
}

(并且btw认为typedef确实令人困惑,因为insert函数的第二个参数实际上是struct node **类型)

答案 1 :(得分:2)

在C和C ++中,除非通过引用明确标记,否则所有函数参数都按值传递。这包括指针参数。

如果它是空指针,insert函数正在尝试更改第一个参数。这不起作用,因为对指针所做的任何更改都不会从函数传递。如果您希望更改node *head,则需要将node& headinsert(使用C ++)传递到head函数。