c 语言中变量的初始化及生存期、作用域浅谈
生存期和作用域相关的关键字extern,static,auto,register
变量的初始化相关问题
关键字介绍
- extern
extern 可以作用于变量,函数。所谓的外部变量是指定义在所有函数之外的变量。一般有两种,一种是定义在同一文件中,另一种是定义在别的文件中。同一个文件中的所有函数可以使用该文件中定义的外部变量而不要求必须用extern进行声明。函数如果想使用定义在不同文件中的变量,则必须利用extern关键字进行声明。extern就相当于一个引用声明。extern 作用于函数时类似。
详细说明参见[http://blog.chinaunix.net/uid-22391661-id-1774382.html]. - static
static 是一个神奇的关键词,因为其用法实在太繁杂。主要应用场景包括:作用于外部变量,作用于内部变量,作用于函数。作用于外部变量和函数的时候,作用和extern相反,表明外部文件无法使用该变量或函数。作用于内部变量时,对该变量在静态区进行一次内存分配,后面再次调用函数的时候,不用再次分配。
详细说明参见[http://www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html] - auto and register
auto用来声明变量是自动的,也就是在运行的时候分配内存。一般在函数中定义的变量都是auto类型的。register指寄存器变量,不太常用。
变量初始化问题
全局变量和静态变量在进行初始化的时候全部清零。
局部变量如果未初始化,分配的值一般为0xcccccccc。但是通过在vs中的测试,发现字符数组初始化都为0,可能是编译器相关吧。
堆栈中分配的变量,一般系统默认为0.