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
相关产品推荐
相关产品推荐

