代码之家  ›  专栏  ›  技术社区  ›  VoidWalker

将静态变量称为local正确吗?

  •  3
  • VoidWalker  · 技术社区  · 12 年前

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

    1) 静态分配是当您声明一个静态 变量每个静态变量定义一个固定的空间块 大小当您的程序启动时,空间被分配一次,并且 永远不会被释放。

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

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

    问题是:就内存分配而言,将函数中的静态变量称为“局部”是否正确?为什么? 提前感谢大家。

    附言:欢迎使用C标准的任何报价。

    5 回复  |  直到 12 年前
        1
  •  4
  •   Community CDub    4 年前

    C标准没有定义 局部变量 . 自动的 静止的 提到 储存持续时间 .

    C11(n1570),§6.2.4物体的储存持续时间

    对象的存储持续时间决定了其生存期。

        2
  •  3
  •   John Zwinck    12 年前

    你可以把它称为“函数局部静态变量”或类似的东西,但如果你简单地把它叫做“局部变量”,你可能会发现当人们发现它实际上是静态的,因此具有全局变量的一些属性时,他们会感到惊讶。

        3
  •  2
  •   bash.d    12 年前

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

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

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

    对于你的问题:不,变量不可能是 静止的 automatic 同时 如果你检查他们的地址,你会发现 静止的 变量不存在于当前堆栈帧中。

        4
  •  2
  •   Blagovest Buyukliev    12 年前

    在变量的上下文中,术语 地方的 大多数情况下表示可见性和范围,而不是存储机制和寿命。

    使用术语 局部变量 事实上,在C中是不准确的,因为标准从来没有谈到过这一点。

    非正式地说,函数内部的静态变量可以说是 地方的 在函数的可见范围内,但仅限于此。

    我建议不要使用这个词 局部变量 完全相反,应该讨论函数中的静态变量、自动变量、文件范围中的静态参数和全局变量。

        5
  •  1
  •   Barath Ravikumar    12 年前

    问题是:就内存分配而言,将函数中的静态变量称为“局部”是否正确?为什么?

    静态变量存储在分配给程序的内存的数据部分。 即使静态变量的作用域结束,它仍然可以在其外部访问 范围,这可能表明,数据段的内容可能是独立的 范围内。

    实例

    #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在每次函数返回时都会超出作用域,但会持续 保留其价值。这是可能的,因为变量与函数不在同一堆栈上,但它完全存在于不同的内存区域,即数据段中。