c - 函数局部的静态变量

标签 c memory memory-management compiler-errors static-variables

我正在学习 C 中的存储类。我有一个简单的代码

enter code here
int f1()
{
    static int i=0;
    i++;
    printf("%d",i);
}

int f2()
{
    printf("%d",i);
}

int main()
{
    f1();f2();f1();f2();
}

编译器给出错误,因为“i”在 f2() 中未声明。 正如我所想,内存静态变量分配在程序内存的数据部分。因此该文件中的任何函数都应该能够访问它。

编译器如何知道在函数中局部声明的变量仅限于该函数?编译器如何评估它?

最佳答案

尽管 static 变量的生命周期与定义它的范围无关(不同于具有自动存储持续时间的变量):

{
    static int i=0;
    i++;
    ...
    {
        i++;  // <-- still well defined, even in nested scope
    }
}
i++;  // <-- undefined

它只能在这个范围内访问。编译器只是检查符号 i 之前是否定义过,它发现 i 没有在该范围内定义(static int i=0; 定义了一个可在本地访问的变量~编译器不关心它的生命周期)。

如果您需要在其范围之外访问它,则必须通过引用(其地址)将其传递出它或将其设为全局:

static int i = 0;
...
{
    i++;
}
...
i++;  // <-- accessing global variable

关于c - 函数局部的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18980481/

相关文章:

c - 字符串的倒三角形

java - Android java,获得更多允许的内存使用

c++ - 为什么在4GB的虚拟内存空间上只能分配2GB?

c++ - C++ 中的删除运算符是否需要正确的类型?

macos - 内存是否被锁定(固定)?

c - 当 "aa"字符串分配给整数变量时发生了什么?

c - 如何用C语言在windows和linux下清屏

c - 如何使用 C 语言代码在石头剪刀布中添加更多选择

arrays - 将字符串 char 设置为 null 会导致 C 中的内存泄漏吗?

检查某个地址是否属于给定的内存块