为什么指针argv没有更新?

时间:2018-01-13 04:07:22

标签: pass-by-pointer

有人可以帮我理解为什么在new()调用后指针头没有更新?

预期:val:0#调用new(),将l0.val更新为0 actual:val:253784#为什么更新l0.val不会被指针更新

https://www.edaplayground.com/x/54Nz

#include <stdio.h>
#include <stdlib.h>

typedef struct _node {
  int val;
  struct _node *next;
} node;

//construct the struct
void new(node *head) {
  //malloc return a pointer, type casting to (node*)
  node *head_l = (node*)malloc(sizeof(node));

  if(!head_l) {
    printf("Create Fail!\n"); 
    exit(1); 
  }

  head_l->val = 0;
  head_l->next = NULL;

  printf("head_l->val:%0d\n",head_l->val);

  //why head = head_l doesn't work??
  head = head_l;
  //The line below works
  //*head = *head_l;
}

int main() {
  node l0;
  new(&l0);
  printf("val:%0d\n",l0.val);
}

2 个答案:

答案 0 :(得分:0)

函数参数仅接收它们传递的值,而不接收参数的任何引用或其他连接。调用该函数时,参数head设置为指向l0的指针的值。更改head不会更改l0

答案 1 :(得分:0)

通过参考帖子 - Having a function change the value a pointer represents in C,我找到了根本原因。

我们说 head 的地址是[0x0000_0010] - &gt;节点对象为NULL。

head_l 的地址为[0x0003_DF58] - &gt; node.val = 0的节点对象。

head = head_l;仅将 head 从0x0000_0010修改为0x0003_DF58。

* head = * head_l;修改[0x0000_0010] - 头点的值,到[0x0003_DF58] - head_l的值。

后者将目标值(NULL)更改为新值(node.val = 0)。