You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

局部非静态变量每次调用函数时都会获得相同内存地址吗?

非静态局部变量每次调用函数时地址相同是必然还是巧合?

我编写了一个名为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:55:27