局部变量保存相同的内存地址
Local variables hold the same memory addresses
以下程序打印两个不同变量的地址。
#include <iostream>
using namespace std;
void f1()
{
int i,k;
cout<<"f1 : "<<&i<<endl;
}
void f2()
{
int j;
cout<<"f2 : "<<&j<<endl;
}
int main() {
f1();
f2();
return 0;
}
现场演示
当我在GCC上运行这个程序时,我想知道两个变量具有相同的地址。
为什么两个变量的地址相同?
编辑:
void f1()
{
int i = 10;
cout<<"f1 : "<<&i<<endl;
cout<<"value of : "<<i<<endl;
}
void f2()
{
int j;
cout<<"f2 : "<<&j<<endl;
cout<<"value of j : "<<j<<endl;
}
int main() {
f1();
f2();
return 0;
}
现场演示 2
在此示例中,如果我将值 10 分配给i
则j
也打印10
。我认为这是无效的,因为j
未初始化。
因为它们的生存期不重叠,所以编译器能够重用它们的存储。
函数的每个调用都需要自己的位置来存储变量。但是一旦函数返回,变量就不再存在。没有理由不能重复使用该地址。它不一定是,但没有理由它不能。
堆栈空间用于保存调用函数时从函数及其局部变量返回所需的信息。当函数返回时,局部变量将从堆栈中删除,返回信息将从堆栈中删除,使堆栈恢复到调用函数时的位置。由于两个函数调用相似,因此在这两种情况下,它们最终的堆栈相同,从而使局部变量具有相同的地址。
在该示例中,如果我将值 10 分配给 i,则 j 也会打印 10。我 认为这是无效的。
在此示例中,您没有使用 c++ 的任何内存分配概念。因此,您刚刚存储在 i
中的值将保持不变,因为它永远不会从分配给 i 的内存中删除,然后当您调用fun2
时,将为j
分配相同的内存。这就是为什么两个变量和地址都得到相同的值。
它们使用相同的堆栈内存块。返回 f1 调用后,堆栈内存可用。然后 f2 再次获得相同的堆栈内存。因此,如果您在另一个函数 f3 中调用 f2,则可能会看到不同的地址。
在该示例中,如果我将值 10 分配给 i,则 j 也会打印 10。我认为这是无效的。
关于您的第二个示例(请在问题中发布与问题相关的代码,不要链接它们):
void f2()
{
int j;
cout<<"f2 : "<<&j<<endl;
cout<<"value of j : "<<j<<endl;
}
这是未定义的行为,j
具有不确定的值,并且任何(*)评估导致不确定的值(在调用时发生的值)cout<<j
给出未定义的行为。
实际上,这包括具有任意值,陷阱表示(在具有它们的平台上,据我所知,现在:)并不多),最糟糕的是允许编译器进行优化,就好像j具有任何值一样(导致可能违反逻辑的行为)。
(*) 有例外,但在这种情况下无关紧要
您应该知道局部变量和全局变量在不同函数中的工作方式,变量是局部的。
每次调用函数时,它都会为其分配值和内存地址,因为它存储在堆栈内存中,并在函数结束时被清理。内存被释放,相同的内存可以再次使用n。
但可能是你的编译器生气了。放完整的源代码,然后仔细弄清楚。
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 使用内存地址访问结构的属性值
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 将布局映射到内存地址
- 为什么同一个变量的内存地址不同?
- 无法将内存地址转换为值
- 给定特定内存地址的数组的动态内存分配
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 获取 R 数据帧的内存地址
- c++ 编译器是否保护常量内存地址免受任何更改?
- 如何防止矢量的内存地址更改
- cout 打印内存地址而不是值
- 如何运行外部程序,向其传递内存地址以读取/写入?
- 循环中的变量被设置为下一个数组的元素始终具有相同的内存地址?
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- C++在变量的内存地址上做什么来"deallocate"它?
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 为什么我无法获取 MSVS2019 / C++ 中字符或uint8_t变量的内存地址?