您好,欢迎来到微智科技网。
搜索
您的当前位置:首页浅谈C中静态变量与全局变量初始化时间

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

来源:微智科技网
浅谈C中静态变量与全局变量初始化时间

浅谈C中静态变量与全局变量初始化时间发表于2012/10/26 13:43:10 7432人阅读分类: C语言+编程

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变量,但是编译器哥哥不会让你访问.

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

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

1/1

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务