C 将静态变量称为局部变量是否正确?
众所周知,C语言通过C程序中的变量支持两种内存分配: 1) 静态分配是在声明静态 变量每个静态变量定义一个固定的空间块 尺寸。当程序启动时,空间分配一次,然后 他永远不会自由 2) 当您声明自动分配时,会发生自动分配 变量,如函数参数或局部变量。空间 对于自动变量,当复合语句 输入包含声明的内容,并在该复合时释放 语句已退出 (这是一个完整的引用) 问题是:在内存分配方面,调用函数中的静态变量“local”正确吗?为什么? 提前感谢大家C 将静态变量称为局部变量是否正确?,c,variables,memory,static,keyword,C,Variables,Memory,Static,Keyword,众所周知,C语言通过C程序中的变量支持两种内存分配: 1) 静态分配是在声明静态 变量每个静态变量定义一个固定的空间块 尺寸。当程序启动时,空间分配一次,然后 他永远不会自由 2) 当您声明自动分配时,会发生自动分配 变量,如函数参数或局部变量。空间 对于自动变量,当复合语句 输入包含声明的内容,并在该复合时释放 语句已退出 (这是一个完整的引用) 问题是:在内存分配方面,调用函数中的静态变量“local”正确吗?为什么? 提前感谢大家 注:欢迎引用C标准。你可以称它为“函数局部静态变量”或类似
注:欢迎引用C标准。你可以称它为“函数局部静态变量”或类似的东西,但如果你简单地称它为“局部变量”,你可能会发现人们发现它实际上是静态的时会感到惊讶,因此具有全局变量的某些属性。C中有两种类型的静态变量
static
表示这些变量只能在此翻译单元中看到静态
和自动
。
如果您检查它们的地址,您将发现
静态变量不存在于当前堆栈帧上。C标准没有定义局部变量的术语。自动和静态是指存储持续时间
C11(n1570),§6.2.4物体的储存期限
对象的存储持续时间决定其生存期
在变量上下文中,术语local通常表示可见性和范围,而不是存储机制和生存期
在C中使用术语局部变量实际上是不准确的,因为标准从来没有提到过这一点
非正式地说,函数中的静态变量可以说是函数可见范围内的局部变量,但仅此而已
我建议不要使用局部变量这个术语。相反,我们应该讨论函数中的静态变量、自动变量、文件范围中的静态变量和全局变量
问题是:在内存分配方面,调用函数中的静态变量“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++ ;
}
#包括
整数增量(无效);
int main()
{
printf(“\ni=%d”,increment());
printf(“\ni=%d”,increment());
printf(“\ni=%d”,increment());
}
整数增量(无效)
{
静态int i=1;
返回i++;
}
在上面的示例中,在每次调用increment()函数之后,每次函数返回时,函数中的静态变量i都会超出范围,但会持续
保留其价值。这仅仅是因为变量与函数不在同一堆栈上,但它完全存在于不同的内存区域,即数据段中。我之所以要问这个问题,是因为据我所知,这样的变量仅在范围上是局部的。你能提供一个例子吗?@HighPredator请看一下上面的例子,以便我理解这个例子。首先,在“return”语句中,函数将控制权返回给调用方。其次,创建一个临时变量来存储递增的“i”值。我是对的吗?是的,你在某种意义上是对的,这样理解,从函数返回变量,类似于将参数传递给函数。中间有一个匿名变量被创建和销毁。请在@BarathBushan这里阅读更多关于它的信息,这取决于。当返回结构时(是的,这是合法的),可能发生的情况是被调用函数将结果复制到调用者提供的空间中。“全局范围”(整个程序)、“文件范围”(外部函数,但静态)和“块范围”(在{…}
内部定义)。