C中的静态局部变量地址

时间:2019-02-17 23:14:21

标签: c scope static-variables

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

本地static与常规全局变量之间几乎没有什么区别。

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));
   }
}

在链接并加载程序后,所有这些地址都有固定的地址。

局部静态变量类似于全局变量,只是它们只能在其作用域及其嵌套子作用域内(通过其名称)被引用。 (您可以通过指针从不相关的范围中引用它们。)