C中的静态局部变量地址
static local variable address in C
我知道静态局部变量在程序的生命周期内一直存在。但是静态局部变量是否保持相同的内存地址?
或者编译器只是确保它存在并且可以在本地范围内访问?
是的,每个静态变量的地址偏移量在编译时是已知的。当二进制文件加载到内存中时,局部变量存储在程序地址space.
的.data段中
换句话说,静态变量的地址在代码执行过程中不会改变。
在 C 中,对象在其生命周期内不会四处移动。只要一个对象存在,它就会有相同的地址。
具有静态存储的变量(这包括声明为 static
的块作用域的变量)的生命周期涵盖程序的整个执行过程,因此它们具有常量地址。
本地 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));
}
}
一旦程序被链接和加载,所有这些都有固定的地址。
局部静态类似于全局变量,除了它们只能在其作用域及其嵌套子作用域内引用(通过它们的名称)。 (您可以通过指针从不相关的范围引用它们。)
我知道静态局部变量在程序的生命周期内一直存在。但是静态局部变量是否保持相同的内存地址?
或者编译器只是确保它存在并且可以在本地范围内访问?
是的,每个静态变量的地址偏移量在编译时是已知的。当二进制文件加载到内存中时,局部变量存储在程序地址space.
的.data段中换句话说,静态变量的地址在代码执行过程中不会改变。
在 C 中,对象在其生命周期内不会四处移动。只要一个对象存在,它就会有相同的地址。
具有静态存储的变量(这包括声明为 static
的块作用域的变量)的生命周期涵盖程序的整个执行过程,因此它们具有常量地址。
本地 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));
}
}
一旦程序被链接和加载,所有这些都有固定的地址。
局部静态类似于全局变量,除了它们只能在其作用域及其嵌套子作用域内引用(通过它们的名称)。 (您可以通过指针从不相关的范围引用它们。)