You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何指针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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:09:29