繁体   English   中英

功能局部的静态变量

[英]Static variables local to function

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

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

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

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

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

编译器如何知道在函数中局部声明的变量仅与该函数绑定?编译器如何评估?

尽管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

静态变量确实存储在data部分中,但仅在声明它们的函数范围内。

您应该执行以下操作

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

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

现在两个函数都可以访问变量i。

永远记住,作用域是编译时而不是运行时。 C具有平坦的内存结构。 这意味着您可以从任何地方访问任何内容。 您可以创建i的指针并可以访问它。 但是,当变量的范围结束时,C表示未定义的行为。 这完全是编译器的限制。 您还可以看到链接-C的作用域是否仅与编译时相关,因为我们知道我们可以在运行时访问任何内存? 更多细节。 同样,这可能会有所帮助。静态变量和全局变量都位于数据段中。 不过,静态变量的范围受到限制。 为什么? 因此,正是翻译单元引发了错误。

让我们通过示例来了解这一点。

#include "stdio.h"


int *ptr_i;

void func1()
{
  static int i = 0;

  ptr_i = &i;

  i++;
  printf("The static i=%d\r\n",i);

}

int main(int argc, char *argv[])
{

  func1();

  (*ptr_i)++;

  func1();


}

该程序的输出如下。 静态i = 1静态i = 3

如您所知,范围不是运行时。 我可以通过指针访问i使用的内存位置。 因此,您可以访问C中的任何内存,因为它是平面内存结构。 在此示例中,我使用指向i的指针访问了i的内存。 注意,编译器永远不会抛出任何错误。 因此,范围是编译时而不是运行时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM