[英]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.