2013-09-24 108 views
2

我学习存储类中C.I有一个简单的代码静态局部变量函数

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为未申报的()。 正如我所想,内存静态变量分配在程序内存的数据部分。因此该文件中的任何功能都应该能够访问它。

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

+0

http://stackoverflow.com/questions/6223355/static-variables-in-class-methods可能的答案 –

回答

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 
+0

是的,通过使其成为全局或传递引用,我可以在任何地方访问它。但是如何在静态分配的情况下编译器如何考虑与特定函数绑定的特定变量? – Arya

+0

@Purisima:看我的编辑。现在应该更清楚了。 – LihO

1

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

你应该做到以下几点

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

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

现在变量i可以访问由两个职能。

+0

请参阅我编辑的问题。 – Arya

+0

对不起,我到目前为止没有看到您的编辑 – hamon

1

永远记住,范围编译时不是运行时。 C有一个平坦的内存结构。这意味着你可以从任何地方访问任何东西你可以制作一个指针,并且可以访问它。但是,当变量的范围结束时,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(); 


} 

该程序的输出如下。如你所知,范围不是运行时间。你可能已经理解了,范围并不是运行时间。我能够通过指针访问我使用的内存位置。因此,你可以访问C中的任何内存,因为它是一个平坦的内存结构。在这个例子中,我使用指向i的指针访问了我的内存。请注意,编译器从不抛出任何错误。因此,范围是编译时间而不是运行时间。

+0

如果是这样,范围的确切用途是什么?为什么制定这个标准?你能举出任何例子来解释它的用途吗? – Arya

+0

我修改了我的答案,请检查它 –

相关问题