1.全局变量
定义在函数内部的变量为本地变量;定义在函数外面的变量是全局变量。
本地变量的生存期和作用域一致,都在函数内部;全局变量具有全局的生存期和作用域。它们与任何函数都无关,在任何函数内部都可以使用它们。
全局变量的初始化
没有做初始化的全局变量编译器会自动给它补上 0 值。指针会得到 NULL 值。本地变量一定要初始化!!!
只能用编译时刻已知的值来初始化全局变量。全局变量的值不应该和另一个全局变量联系在一块。
它们的初始化发生在 main 函数之前。
被隐藏的全局变量
如果函数内部存在与全局变量同名的变量,则全局变量被隐藏。
在更小的地方,可以重新定义更大地方曾经出现过的变量,把它隐藏。
2.静态本地变量
在本地变量定义时加上 static 修饰符就成为静态本地变量。当函数离开的时候,静态本地变量会继续存在并保持其值。
静态本地变量的初始化只会在第一次进入这个函数时做。以后进入函数时会保持上次离开时的值。不会被重新初始化。
静态本地变量实际上是特殊的全局变量。它们位于相同的内存区域(与全局变量紧挨)。
静态本地变量具有全局的生存期,函数内部的局部作用域。static 在这里的意思是局部作用域(仅本地可访问)。
3. TIPS
返回指针的函数
返回本地变量的地址是危险的,一旦离开函数,本地变量不存在(不受控),地址分配给别人使用。
返回全局变量或静态本地变量的地址是安全的(地址与函数无关)。
返回在函数内 malloc 的内存是安全的,但是容易造成问题。
最好的做法是返回传入的指针。
不要使用全局变量在函数间传递参数和结果。
尽量避免使用全局变量(使用全局变量和静态本地变量的函数是线程不安全的)。