C中的静态局部变量地址

问题描述 投票:4回答:3

我知道在程序的生命周期中存在一个静态局部变量。但静态局部变量是否保持相同的内存地址?

或者编译器是否确保它存在并且可以在本地范围内访问?

c scope static-variables
3个回答
4
投票

在C对象中,它们在其生命周期内不会移动。只要存在对象,它就具有相同的地址。

具有静态存储的变量(这包括块范围声明为static的变量)具有覆盖程序整个执行的生命周期,因此它们具有恒定的地址。


2
投票

本地statics和普通全局变量之间几乎没有什么区别。

int x = 42; //static lifetime, external name
static int y = 43; //static lifetime, no external name, 
                   //referencable in all scopes here on out
                   //(unless overshadowed)
int main()
{
   static int z = 44; //like y, but only referencable from within this scope
                      //and its nested scopes
   {
       printf("%p\n", (void*)&z));
   }
}

一旦程序被链接和加载,所有这些都具有固定的地址。

局部静态就像全局变量一样,除了它们只能在它们的范围和它的嵌套子范围内引用(通过它们的名字)。 (您可以通过指针从不相关的范围引用它们。)


2
投票

是的,每个静态变量的地址偏移量在编译时都是已知的。当二进制文件加载到内存中时,局部变量存储在程序地址空间的.data段中。

换句话说,静态变量的地址在代码执行期间不会改变。

© www.soinside.com 2019 - 2024. All rights reserved.