全局变量
- 定义在函数外面的变量是全局变量
- 全局变量具有全局的生存期和作用域
- 在任何函数内部都可以使用它们
全局变量的初始化
- 没有初始化的全局变量会得到0值
- 指针会得到NULL
- 只能用编译时刻已知的值来初始化全局变量
const int gall = 12;
int g2 = gall;
这种写法是正确的,常量可以用来初始化
int gall = 12;
int g2 = gall;
这种写法是错误的,变量不可用来初始化
- 它们的初始化发生在main函数之前
被隐藏的全局变量
- 如果函数内部存在与全局变量同名的变量,则全局变量被隐藏
f()函数中新定义的局部变量gall把全局变量的值隐藏了,但出了f(),全局变量的值没有变
静态本地变量
- 在本地变量定义时加上static修饰符就成为静态本地变量
- 当函数离开的时候,静态本地变量会继续存在并保持其值
- 静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开时的值
- 静态本地变量实际上是特殊的全局变量
- 它们位于相同的内存区域
- 静态本地变量具有全局的生存期,函数的局部作用域
- static在这里的意思是局部作用域(本地可访问)
返回指针的函数
- 返回本地变量的地址是危险的(原因:出了作用域,被释放后,该地址可能会被分配给其他变量)
- 返回全局变量或静态本地变量的地址是安全的
- 返回函数内malloc的内存是安全的,但是容易造成问题
- 最好的做法是返回传入的指针
tips:
- 不要使用全局变量来在函数之间传递参数和结果
- 尽量避免使用全局变量
- 使用全局变量和静态本地变量的函数是线程不安全的