C++局部变量地址输出问题

老哥们,为啥这段代码输出的两个地址不一样?
今天刚了解到函数形参和局部变量都存放在栈区,但是我不太清楚函数形参的地址该如何调用,下面的代码是一个模糊的尝试,希望能得到对代码结果的解释

img

一个是局部变量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()返回的是一个动态分配的变量的地址,而不是局部变量的地址,所以输出的两个地址相同,并且在程序结束之前需要手动释放动态分配的内存。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^