Почему указатель argv не обновляется?

Может кто-нибудь помочь мне понять, почему головка указателя не обновляется после вызова new()?

ожидается: val:0 # вызовите new(), обновите l0.val до 0 фактического: 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 ответа

Параметры функции получают только передаваемое им значение, а не какую-либо ссылку или другое соединение с аргументом. Когда функция вызывается, параметр head устанавливается в значение указателя на l0, изменения head не меняется l0,

Обращаясь к сообщению: " Имея функцию, изменяющую значение, которое указатель представляет в C, я могу найти основную причину.

Допустим, адрес головы равен [0x0000_0010] -> объект узла с NULL.

Адрес head_l: [0x0003_DF58] -> объект узла с node.val=0.

голова = голова_l; измените только головку с 0x0000_0010 до 0x0003_DF58.

* head = * head_l; изменить [0x0000_0010] - значение точек заголовка, на [0x0003_DF58] - значение точек head_l.

Последний изменит целевое значение (NULL) на новое значение (node.val=0).

Другие вопросы по тегам