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

C语言函数传值机制下main函数指针未保留局部变量地址问题咨询

问题根因分析

你的程序出现该行为的核心原因有两个:

1. C语言函数参数默认是值传递

你在main中定义的ptr和fun的形参ptr是两个完全独立的变量,两者仅在调用fun时做了一次值拷贝:即fun的形参ptr初始值等于main中ptr的NULL值。
你在fun内部执行ptr = &a;修改的只是fun栈帧上的形参ptr的值,完全不会影响到main中定义的原ptr变量,因此main里的ptr一直保持NULL,后续解引用NULL指针自然触发段错误。

2. 栈局部变量的生命周期限制

哪怕你通过传参方式把main中的ptr成功赋值为&a,后续访问该指针也是未定义行为:a是fun的栈局部变量,fun执行结束后对应栈帧会被销毁,a的内存地址已经被系统回收,此时指向该地址的指针就是野指针,访问结果完全不可控。


修正示例

如果需要在fun中修改main里的指针变量,需要传指针的地址(即二级指针),示例如下:

#include <stdio.h>
// 形参用二级指针接收main中ptr的地址
void fun(int** ptr)
{
    // 注意这里如果要返回合法地址,不能用栈局部变量,要么用static,要么用堆内存
    static int a = 5; // static修饰的变量生命周期和程序一致,不会随fun结束销毁
    *ptr = &a; // 修改的是main里ptr的值
    printf("fun内 a的地址: %p, 值: %d\n", &a, a);
}

int main(void)
{
    int* ptr = NULL;
    fun(&ptr); // 传ptr本身的地址
    printf("main内 ptr指向的地址: %p, 值: %d\n", ptr, *ptr);
    return 0;
}

如果用堆内存的话注意后续手动调用free释放,避免内存泄漏。


内容的提问来源于stack exchange,提问作者Saad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:36:01