浅谈C中静态变量与全局变量初始化时间

时间:2021-07-17 19:39:59

int a;

main()

{

while(1)

{

   static b=1;

   a=2;

   b++;

   a++;

}

}

我们所理解的静态变量b,只知道它在上面的函数内部只初始化一次,其实是个假像 ,我要表达的是,事实上b初始化的值,不是在循环体完成的.继续下看.

while(1)

{

   static b=1;

   a=2;

   b++;

   a++;

}

注意这一句:

static b=1;为什么我们循环体无限循环,b 他只会赋一次值呢,从C上面是看不出来的.

   经过我反汇编发现,

static b=1; 根本不在循环体中.可以想像,程序被译成目标机器的时候是这个样子

   while(1)

{

   //static b=1;   这句没有!

   a=2;

   b++;

   a++;

}

那么b是什么时候赋的值呢,是编译的时候就确定了。。就是说,编译的时候,就给b初始化好了!

类似,我们定义全局变量,如果不赋值,编译器给他赋上0.如果定义了值,就在编译的时候就确定下来了,这个值是编译器根据我们的语句赋给它的.而不程序中指令赋给它的!

     那么这个 a,b变量都在哪呢,他们呆在所谓的静态存储区(后面有介绍),物理上整个程序中任意代码都能访问到这片区域,说明他们在存储上是一样的.但是a,b区别又在哪呢,就是对他们的引用,编译器,允许你任何地方,函数中调用a,而b,不行,他有局部作用域,比如你在一个函数中声明了静态变量b,那只能在这函数中调用b.如果在其它的地方调用它,编译器会报错.这就是逻辑上的控制,而实际上,"物理"上是允许程序在任意地方访问b变量,但是编译器哥哥不会让你访问.

           那什么又叫静态存储区呢,我个人认为就是这是安全区域,不会随便被别的变量替掉.分给你的就是你的,不会被别人给占了.

           谈到这里我们顺便提一下,我们其它函数的局部变量存在内存中的位置,局部变量存放在栈中,栈是一片特殊内存区域,多个变量可能共享使用这片区域,这里我们就可以看到一个问题,既然共享使用,假如我们声明一个局部变量,如果不赋初值,这个变量所在栈中的位置,这个位置包含的值,是随机的,是上次别的变量留下来的值.