局部非静态变量每次调用函数时都会获得相同内存地址吗?
非静态局部变量每次调用函数时地址相同是必然还是巧合?
我编写了一个名为show()的函数,在其中声明了一个static变量和一个非static变量;观察到每次调用该函数时,非静态局部变量都会获得相同的内存地址。想了解这种情况是必然出现的,还是只是巧合。
代码示例
#include<iostream> #include<cstring> using namespace std; void show() { static int x = 10; int y = 20; cout<<"Address of y = "<< &y<< endl; cout<< "x = "<< x<< " , y = "<< y<< endl; x++; y++; } int main() { show(); int x = 10; cout<< x<< endl; cout<< "len = "<< strlen("Kumar")<< endl; show(); show(); return 0; }
运行输出
Address of y = 0xd01f5ffc6c x = 10 , y = 20 10 len = 5 Address of y = 0xd01f5ffc6c x = 10 , y = 20 Address of y = 0xd01f5ffc6c x = 10 , y = 20
解答
这种情况不是必然的,只是常见的巧合,原因如下:
- 非静态局部变量(比如示例里的
y)存储在程序的栈(stack)区域。每次调用函数时,栈会临时为它分配空间;函数执行完毕返回后,这块空间会被释放,栈指针会回退。 - 在你的测试场景中,两次调用
show()之间的代码(声明变量x、调用strlen)没有大幅改变栈的布局,栈指针刚好回到了之前的位置,所以y被分配到了同一个地址。 - 但只要改变栈的状态,
y的地址就会变化:比如在两次show()调用之间,调用一个需要占用大量栈空间的函数、分配栈上的大数组,或者发生线程切换,栈指针的位置都会被改变,此时再调用show(),y的地址就会和之前不同。 - 从C++标准的角度来说,并没有规定非静态局部变量的地址必须在每次函数调用时保持一致,这完全取决于编译器的实现逻辑和程序运行时的栈状态。
举个简单的修改示例,只要在两次show()调用之间插入一个占用栈空间的函数,就能看到地址变化:
void other_func() { char big_buffer[1024]; // 占用栈上的1KB空间 } int main() { show(); int x = 10; cout<< x<< endl; cout<< "len = "<< strlen("Kumar")<< endl; other_func(); // 改变栈布局 show(); show(); return 0; }
运行这段代码,就能观察到y的地址不再和第一次调用时相同。
内容的提问来源于stack exchange,提问作者big_0
相关产品推荐
相关产品推荐

