众所周知,C语言通过C程序中的变量支持两种内存分配:
1)静态分配是声明静态时发生的情况 变量。每个静态变量定义一个固定的空间块 尺寸。程序启动时,空间分配一次,并且 永远不会被释放。
2)声明自动时会发生自动分配 变量,例如函数参数或局部变量。空间 对于自动变量,在复合语句时分配 输入包含声明,并在该化合物时释放 声明已退出。
(这是http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_3.html)
的完整引用问题是:在内存分配方面调用“本地”函数中的静态变量是正确的,为什么? 提前感谢大家。
P.S。欢迎来自C标准的任何引用。
答案 0 :(得分:4)
C标准没有定义局部变量的术语。 自动和静态指的是存储持续时间。
C11(n1570),§6.2.4对象的存储持续时间
对象具有确定其生命周期的存储持续时间。
答案 1 :(得分:3)
您可以将其称为“函数本地静态变量”或类似的东西,但如果您只是将其称为“局部变量”,您可能会发现人们在发现它实际上是静态时会感到惊讶,因此有一些全局变量的属性。
答案 2 :(得分:2)
C中有两种类型的静态变量。
全局静态变量,其中static
表示这些变量只能在此翻译单元中看到。
具有本地scop的静态变量(即在函数中)。这些被初始化一次,并在超出范围后保留其值事件。
对您提问:不,变量不能同时为static
和automatic
。
如果您检查他们的地址,您将看到static
变量不在当前堆栈帧上。
答案 3 :(得分:2)
在变量的上下文中,术语 local 通常表示可见性和范围,而不是存储机制和生命周期。
在C语言中使用术语局部变量实际上是不准确的,因为标准从未对此进行过讨论。
非正式地,函数内部的静态变量可以说是在函数的可见范围内的 local ,但不会多于此。
我建议不要使用术语局部变量。相反,应该讨论函数中的静态变量,自动变量,文件范围中的静态变量和全局变量。
答案 4 :(得分:1)
问题是:在内存分配方面调用函数“local”中的静态变量是正确的吗?
静态变量存储在分配给程序的内存的数据部分中。 即使静态变量的范围结束,它仍然可以在其外部访问 范围,这可能表明,数据段的内容可能是独立的 范围。
实施例
#include <stdio.h>
int increment(void);
int main()
{
printf("\ni = %d",increment());
printf("\ni = %d",increment());
printf("\ni = %d",increment());
}
int increment(void)
{
static int i = 1;
return i++ ;
}
在上面的例子中,在每次函数调用increment()之后,函数内部的静态变量i每次函数返回时都会超出范围但是持久 保留其价值。这是唯一可能的,因为变量与函数不在同一堆栈中,但它完全存在于不同的内存区域,即数据段。