C++函数返回局部变量指针导致输出不符问题求助
问题分析:返回局部变量指针导致的悬垂指针问题
嘿,别担心,这个坑几乎是每个C++新手都会踩的,完全不是你的问题!咱们一步步拆解哪里出了问题。
首先先贴出你的代码方便对照:
#include <iostream> using namespace std; int* getnew(int* x){ int temp = *x; int* y = &temp; cout << "from function address of y = " << y << " and value of y = " << *y << endl; return y; } int main(){ int x = 100; int* y = getnew(&x); cout << "address of y = " << y; cout << " and value of y = " << *y << endl; return 0; }
核心问题:悬垂指针(Dangling Pointer)
你在getnew函数里定义的temp是局部变量,它的内存是分配在函数专属的栈帧里的。当函数执行完毕、返回main时,这个栈帧会被操作系统销毁,temp占用的内存会被回收,后续可能被其他操作覆盖。
虽然你返回了指向temp的指针y,但回到main函数后,这块内存已经不属于temp了——此时访问*y属于未定义行为,你看到的1只是内存被随机覆盖后的结果,换个时间运行可能会得到完全不同的数。而地址相同只是因为栈帧的位置暂时还没被复用而已。
几种可行的解决办法
这里给你几个常见的正确实现方式,你可以根据自己的场景选择:
1. 使用堆内存动态分配
用new在堆上分配内存,堆内存不会随函数返回自动销毁,记得最后用delete释放避免内存泄漏:
int* getnew(int* x){ int* y = new int; *y = *x; cout << "from function address of y = " << y << " and value of y = " << *y << endl; return y; } int main(){ int x = 100; int* y = getnew(&x); cout << "address of y = " << y; cout << " and value of y = " << *y << endl; delete y; // 必须释放堆内存 return 0; }
2. 让调用者提供内存地址
让main提前分配好内存,把指针传给getnew函数,函数只负责修改值:
void getnew(int* x, int* result){ *result = *x; cout << "from function address of result = " << result << " and value of result = " << *result << endl; } int main(){ int x = 100; int y; getnew(&x, &y); cout << "address of y = " << &y; cout << " and value of y = " << y << endl; return 0; }
3. 直接返回值(最简单的场景)
如果你的需求只是传递数值,完全没必要用指针,直接返回int类型即可:
int getnew(int x){ int temp = x; cout << "from function value of temp = " << temp << endl; return temp; } int main(){ int x = 100; int y = getnew(x); cout << "value of y = " << y << endl; return 0; }
内容的提问来源于stack exchange,提问作者Tushar Vatsal
相关产品推荐
相关产品推荐

