如果静态局部变量也存储在数据段中,为什么不能在两个不同函数中使用的变量不保留值。这样的例子。
void func()
{
static int i=0;
i++;
}
void func1()
{
i++; // here i is stored in the data segment,
// then the scope should be available for entire program
}
为什么值'i'仅在存储在数据段中时才可用于块作用域?这可能是一个愚蠢的问题,但我正在尝试从概念上理解。请帮助我理解概念。提前致谢。
您需要区分变量的[[scope和lifetime。
简单来说:“ scope”表示
源代码已知变量的区域[[对于编译器。如果(根据规则)变量对编译器不可见,则它将拒绝编译对该变量的访问。
“ lifetime”是指从为该变量分配内存直到内存分配给另一个变量或释放该内存的时间。只要程序运行,static
变量就会存在。只要static
变量的作用域在控制范围之内,它就一直存在。但是,仅因为变量的作用域和生存期都已“完成”,并不意味着内存消失。物理单元仍然在那里,并保留其最后的内容。这就是为什么您可以对返回一个指向某些局部变量的指针的函数进行编程,然后检索变量的内容(在变量的作用域和生命周期都消失之后)的原因。这是一个初学者令人困惑的问题的好例子。考虑使用像8051之类的嵌入式处理器的编译器。尽管如此,这是一台非常古老和简单的机器,但却是一个很好的例子。该编译器通常会将局部变量放在其数据段中。但是,要使用有限的内存空间(总共128个字节,包括工作寄存器和堆栈),
same
内存位置将重新用于具有非重叠生存期的变量。即使如此,您也可以从所有程序访问任何内存。