为何指针argv未更新?求解析new()调用后head指针未更新问题
关于指针未更新问题的详细解答
嘿,我来帮你把这两个问题理清楚——核心都是C语言里指针的传参机制在起作用!
一、为何调用new()后head指针未更新,l0.val输出垃圾值?
先看你代码里的关键问题:
你在main里声明了node l0;(这是一个栈上的结构体实例,未初始化时成员都是随机垃圾值),然后把&l0传给new函数的node *head参数。
这里要敲黑板:C语言中所有参数传递都是「值传递」,包括指针!也就是说,new函数里的head是&l0的一个副本——你在函数里写head = head_l,只是修改了这个副本的指向,完全不会影响到main里的l0或者&l0本身。这就是为什么l0.val还是原来的随机值(你看到的253784),根本没被更新。
那为什么*head = *head_l能工作?因为这时候你是通过指针副本,直接修改了它指向的内存区域(也就是main里l0的内存空间),所以l0.val会被改成head_l->val的值。
两种正确的修改方案
方案1:使用二级指针(指针的指针)
通过二级指针,我们可以直接修改原指针的指向:
#include <stdio.h> #include <stdlib.h> typedef struct _node { int val; struct _node *next; } node; void new(node **head) { 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); // 修改传入的原指针的指向 *head = head_l; } int main() { node *l0 = NULL; // 声明指针变量,而非栈上结构体实例 new(&l0); printf("val:%0d\n",l0->val); free(l0); // 记得释放堆内存,避免泄漏 }
方案2:让函数返回堆节点指针
直接把new函数改成返回node*类型,在main里接收返回值:
#include <stdio.h> #include <stdlib.h> typedef struct _node { int val; struct _node *next; } node; node* new() { 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); return head_l; } int main() { node *l0 = new(); printf("val:%0d\n",l0->val); free(l0); }
二、为何指针argv未更新?
你没有给出argv相关的具体代码,但核心逻辑和上面的问题完全一致:
如果argv作为参数传递给某个函数,那么函数里的argv是原指针的副本,修改这个副本的指向不会影响原指针。要修改原指针的指向,同样需要使用二级指针,或者让函数返回新的指针值。
内容的提问来源于stack exchange,提问作者Tom Ma
相关产品推荐
相关产品推荐

