函数本地的静态变量

时间:2013-09-24 11:33:48

标签: 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()中未声明。 我认为,内存静态变量是在程序存储器的数据部分中分配的。所以该文件中的任何函数都应该能够访问它。

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

3 个答案:

答案 0 :(得分:4)

虽然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

答案 1 :(得分:1)

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

您应该执行以下操作

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

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

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

答案 2 :(得分:1)

永远记住Scope是编译时而不是运行时。 C具有平坦的存储器结构。这意味着您可以随时随地访问任何内容。你可以制作一个i的指针并可以访问它。但是,当变量的范围结束时,C表示未定义的行为。这完全是编译器限制。您还可以查看链接 - Is scope in C related only to compile time, as we know we can access any memory at run time?以获取更多详细信息。此外,这可能会有所帮助A static variable and a global variable both reside in data segment. Still, static variable has scope limited. Why?。因此,翻译单元会引发错误。

让我们通过例子来理解这一点。

#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的内存。注意,编译器永远不会抛出任何错误。因此,范围是编译时而非运行时。