1. 首页 > 科技

C语言静态变量问题? c语言全局变量与局部变量

C语言静态变量问题?c语言全局变量与局部变量

C语言,全局变量,静态变量问题

(1)可以肯定,全局变量 不是必须要加static修饰,那么加了static修饰是什么意思?

答:在全局变量前加static表示变量只能在该文件中被引用,而不能在其他文件中用extern关键字引用,例如:

a.c文件:

#define<stdio.h>

int BASE = 100;

int main(){}

b.c文件:

#define <stdio.h>

extern BASE; //在b.c文件中利用extern关键字引用了a.c中的BASE,但如果a.c中用static修饰BASE,那这里的引用就会报错

int main(){printf("%d\n",BASE);}

(2)auto修饰符的定义里有这么一句“进入包含变量声明的代码时,变量开始存在。当程序离开这个代码块时,自动变量消失了。它所占用的内存可用来做别的事情。”,从“当程序离开代码块时变量消失”、“内存可用来做别的事情”可以推出auto修饰的变量是存储在堆栈中的。而全局变量存储在静态存储区中,所以用auto决不能修饰全局变量(已经测试过,Linux下报错:文件作用域中 ‘apple’ 的声明指定了 ‘auto’)

x,y不是static?是auto?答案:不是auto类型

所以我觉得结论是不是这样:

修饰全局变量的存储类型只有static和extern或者不加修饰,auto不能用来修饰全局变量。

C语言中静态变量问题

例如for(i=0; i<10; i++)

    {

    static int sum = 0;

    sum+=i;

    }

不加static修饰每次执都给sum赋值0,最终结果sum=9。加了static就仅执行一次sum=0,最终结果sum=45

C语言中一个关于静态变量的问题

关于这个问题,你要记住静态变量的特点:

1.定义时的初值赋值只执行初始一次;

2.它的值是在静态区分配的,再次执行时它值并不消失;

这不很简单,它的值再次执行都是存在的;

而局部变量(自动变量)就不同了,每次重新分配,重新初始;

上面程序中,主程序中的m是局部变量,栈中分配的;

子程序中m是静态变量,静态区分配的,

这两个m是不同的变量。

c语言局部变量和静态变量的问题

void f()

{

autoint j=0; ///为j开一块内存

++j;

printf("%d\n",j);

} ////至此j的生命周期结束,释放内存,此时已经没有变量j

void f()

{

static int j=0; ////开内存,并初始化j为0,并且在下次调用此函数时,略过此句(即仅执行一遍)

++j;

printf("%d\n",j);

} ///内存不会释放,到主函数(main())结束时方才释放

此外 变量j只能在此函数内使用,对此 大可在main函数里加一句 printf("%d\n",j); 来验证