局部变量持有相同的内存地址
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;
}
在此示例中,如果我将值 10 分配给 i
,则 j
也会打印 10
。我认为它无效,因为 j
未初始化。
因为它们的生命周期不重叠,所以编译器能够重用它们的存储空间。
他们正在使用相同的堆栈内存块。在 f1 调用返回后,堆栈内存是空闲的。然后 f2 再次获得相同的堆栈内存。因此,如果您在另一个函数 f3 中调用 f2,那么您可能会看到不同的地址。
每次函数调用都需要有自己的位置来存储变量。但是一旦函数returns,变量就不再存在了。没有理由不能重复使用该地址。它不一定是,但没有理由不能。
堆栈space用于保存调用函数时return函数及其局部变量所需的信息。当函数 returns 时,局部变量从堆栈中移除,return 信息从堆栈中移除,使堆栈回到调用函数时的位置。由于这两个函数调用是相似的,因此在两种情况下它们最终都使用相同的堆栈,从而使局部变量具有相同的地址。
In that example, if I assigned value 10 to i then j also print 10. I think it is not valid.
关于你的第二个例子(请post问题中与问题相关的代码,不要link'em):
void f2()
{
int j;
cout<<"f2 : "<<&j<<endl;
cout<<"value of j : "<<j<<endl;
}
这是 未定义的行为,j
具有不确定的值,任何 (*) 评估都会导致不确定的值(发生在 cout<<j
调用 ) 给出未定义的行为。
实际上,这包括具有任意值、陷阱表示(在拥有它们的平台上,诚然据我所知现在并不多 :) )并且最糟糕的是允许编译器进行优化,就好像 j 确实具有任何值(结果可能违反逻辑的行为)。
(*) 有例外,但与本例无关
In that example, if I assigned value 10 to i then j also print 10. I
think it is not valid.
在此示例中,您没有使用任何 c++ 的内存分配概念。因此,您刚刚存储在 i
中的值将保持不变,因为它从未从为 i 分配的内存中删除,然后当您调用 fun2
时,相同的内存被分配给 j
.这就是为什么您对两个变量和相同地址获得相同值的原因。
你应该知道局部变量和全局变量在不同函数中的工作,变量是局部的。
每次调用该函数时,它都会为其分配值和内存地址,因为它存储在堆栈内存中并在函数结束时被清理。释放内存,可以再次使用相同的内存。
但可能是您的编译器生气了。
把完整的源码放上去仔细琢磨
以下程序打印两个不同变量的地址。
#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;
}
在此示例中,如果我将值 10 分配给 i
,则 j
也会打印 10
。我认为它无效,因为 j
未初始化。
因为它们的生命周期不重叠,所以编译器能够重用它们的存储空间。
他们正在使用相同的堆栈内存块。在 f1 调用返回后,堆栈内存是空闲的。然后 f2 再次获得相同的堆栈内存。因此,如果您在另一个函数 f3 中调用 f2,那么您可能会看到不同的地址。
每次函数调用都需要有自己的位置来存储变量。但是一旦函数returns,变量就不再存在了。没有理由不能重复使用该地址。它不一定是,但没有理由不能。
堆栈space用于保存调用函数时return函数及其局部变量所需的信息。当函数 returns 时,局部变量从堆栈中移除,return 信息从堆栈中移除,使堆栈回到调用函数时的位置。由于这两个函数调用是相似的,因此在两种情况下它们最终都使用相同的堆栈,从而使局部变量具有相同的地址。
In that example, if I assigned value 10 to i then j also print 10. I think it is not valid.
关于你的第二个例子(请post问题中与问题相关的代码,不要link'em):
void f2()
{
int j;
cout<<"f2 : "<<&j<<endl;
cout<<"value of j : "<<j<<endl;
}
这是 未定义的行为,j
具有不确定的值,任何 (*) 评估都会导致不确定的值(发生在 cout<<j
调用 ) 给出未定义的行为。
实际上,这包括具有任意值、陷阱表示(在拥有它们的平台上,诚然据我所知现在并不多 :) )并且最糟糕的是允许编译器进行优化,就好像 j 确实具有任何值(结果可能违反逻辑的行为)。
(*) 有例外,但与本例无关
In that example, if I assigned value 10 to i then j also print 10. I think it is not valid.
在此示例中,您没有使用任何 c++ 的内存分配概念。因此,您刚刚存储在 i
中的值将保持不变,因为它从未从为 i 分配的内存中删除,然后当您调用 fun2
时,相同的内存被分配给 j
.这就是为什么您对两个变量和相同地址获得相同值的原因。
你应该知道局部变量和全局变量在不同函数中的工作,变量是局部的。
每次调用该函数时,它都会为其分配值和内存地址,因为它存储在堆栈内存中并在函数结束时被清理。释放内存,可以再次使用相同的内存。
但可能是您的编译器生气了。 把完整的源码放上去仔细琢磨