我对调用堆栈的推入和弹出元素的顺序感到困惑。我在static int* ptr
中创建并初始化了void first()
。 注意:我知道可能会发生意外情况。但是令我困惑的是,调用堆栈对最近使用的地址的作用。
当程序进入first()
级别的函数调用second()
时,变量int a
位于int x
之前的地址。但是在函数int z = 99;
中添加行second()
之后,变量a
仍然停留在指向ptr
的地址中。
现在发生了一些奇怪的事情。如果我摆脱了std::cout << " &a = " << &a << std::endl;
行,那么*ptr
将变为99,这意味着变量z
位于x
的调试或再次运行位置。
我认为,ptr
永远不会放入调用堆栈,因为它是一个静态变量,并且保留在数据段中,这意味着ptr
永远不会影响调用堆栈。因此,无论如何,函数second()
中的第一个初始化变量将始终位于函数first()
中的第一个初始化变量所在的位置。
在这种情况下我迷路了。
没有int z = 99
:
void first() {
int x = 7;
static int* ptr = &x;
}
void second() {
int a = 5; // &a = (&x before)
int b = 1;
int c = 2;
int d = 3;
int e = 4;
std::cout << " &a = " << &a << std::endl;
first();
}
int main()
{
first();
second();
first();
}
使用int z = 99
:
void first() {
int x = 7;
static int* ptr = &x;
}
void second() {
int z = 99;
int a = 5; // &a = (&x before)
int b = 1;
int c = 2;
int d = 3;
int e = 4;
std::cout << " &a = " << &a << std::endl;
first();
}
int main()
{
first();
second();
first();
}
没有std::cout
语句:
void first() {
int x = 7;
static int* ptr = &x;
}
void second() {
int z = 99; // &z = (&x before)
int a = 5;
int b = 1;
int c = 2;
int d = 3;
int e = 4;
first();
}
int main()
{
first();
second();
first();
}