我正在学习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()中未声明。 我认为,内存静态变量是在程序存储器的数据部分中分配的。所以该文件中的任何函数都应该能够访问它。
编译器如何知道函数中本地声明的变量仅限于该函数?编译器如何评估它?
答案 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的内存。注意,编译器永远不会抛出任何错误。因此,范围是编译时而非运行时。