调用静态变量本地是否正确?

时间:2013-02-28 11:56:03

标签: c variables memory static keyword

众所周知,C语言通过C程序中的变量支持两种内存分配:

  

1)静态分配是声明静态时发生的情况   变量。每个静态变量定义一个固定的空间块   尺寸。程序启动时,空间分配一次,并且   永远不会被释放。

     

2)声明自动时会发生自动分配   变量,例如函数参数或局部变量。空间   对于自动变量,在复合语句时分配   输入包含声明,并在该化合物时释放   声明已退出。

(这是http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_3.html

的完整引用

问题是:在内存分配方面调用“本地”函数中的静态变量是正确的,为什么? 提前感谢大家。

P.S。欢迎来自C标准的任何引用。

5 个答案:

答案 0 :(得分:4)

C标准没有定义局部变量的术语。 自动静态指的是存储持续时间

  

C11(n1570),§6.2.4对象的存储持续时间

     

对象具有确定其生命周期的存储持续时间。

答案 1 :(得分:3)

您可以将其称为“函数本地静态变量”或类似的东西,但如果您只是将其称为“局部变量”,您可能会发现人们在发现它实际上是静态时会感到惊讶,因此有一些全局变量的属性。

答案 2 :(得分:2)

C中有两种类型的静态变量。

  1. 全局静态变量,其中static表示这些变量只能在此翻译单元中看到。

  2. 具有本地scop的静态变量(即在函数中)。这些被初始化一次,并在超出范围后保留其值事件。

  3. 对您提问:不,变量不能同时为staticautomatic。 如果您检查他们的地址,您将看到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每次函数返回时都会超出范围但是持久 保留其价值。这是唯一可能的,因为变量与函数不在同一堆栈中,但它完全存在于不同的内存区域,即数据段。