老哥们,为啥这段代码输出的两个地址不一样?
今天刚了解到函数形参和局部变量都存放在栈区,但是我不太清楚函数形参的地址该如何调用,下面的代码是一个模糊的尝试,希望能得到对代码结果的解释
一个是局部变量a 的地址,一个是参数a的地址,参数a的地址应该比较小一点,因为堆栈向上扩展
肯定不一样啊,形参和实参不在同一个空间
【以下回答由 GPT 生成】
这段代码的输出结果是两个地址不一样的原因是因为参数a
是主函数main()
中的局部变量,而函数addr()
的形参a
是另一个局部变量。虽然它们的名称相同,但是它们在内存中分别占用不同的位置。
在函数addr()
中,当形参a
传入实参a
的值时,会创建一个新的局部变量a
,并且返回了这个变量的地址。
但是需要注意的是,当函数addr()
执行完毕后,其内部的局部变量a
会被销毁。因此,在主函数main()
中,打印t
和&a
时,t
指向了一个已经销毁的局部变量的地址,而&a
指向的是main()
函数中的局部变量a
的地址。
为了解决这个问题,我们可以将形参a
改为指针类型,并且在函数内部动态分配一个新的变量来存储a
的值,然后返回这个变量的指针地址。
以下是修改后的代码示例:
#include <iostream>
using namespace std;
int* addr(int* a) {
int* new_a = new int(*a);
return new_a;
}
int main() {
int a = 10;
int* t = addr(&a);
cout << t << endl;
cout << &a << endl;
delete t; // 需要手动释放动态分配的内存
system("pause");
return 0;
}
这样修改后,函数addr()
返回的是一个动态分配的变量的地址,而不是局部变量的地址,所以输出的两个地址相同,并且在程序结束之前需要手动释放动态分配的内存。
【相关推荐】