Почему указатель 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).