一, 全局变量
定义在函数外面的变量是全局变量
全局变量具有全局的生存期和作用域
它们与任何函数无关, 在任何函数内部都可以使用它们
- #include <stdio.h>
- int f(void);
- // 全局变量
- int gALL = 12;
- int main(int argc, char const *argv[])
- {
- printf("in %s gALL=%d\n", __func__,gALL);
- f();
- printf("agn in %s gALL=%d\n", __func__,gALL);
- return 0;
- }
- int f(void)
- {
- printf("in %s gALL=%d\n", __func__,gALL);
- gALL += 8;
- printf("agn in %s gALL=%d\n", __func__,gALL);
- return gALL;
- }
- // in main gALL=12
- // in f gALL=12
- // agn in f gALL=20
- // agn in main gALL=20
二, 全局变量初始化
没有做初始化的全局变量会得到 0 值
指针会得到 NULL 值
只能用编译时刻已知的值来初始化全局变量
它们的初始化发生在 main 函数之前
三, 被隐藏的全局变量
如果函数内部存在与全局变量同名的变量, 则全局变量被隐藏
- #include <stdio.h>
- int f(void);
- // 全局变量
- int gALL = 12;
- int main(int argc, char const *argv[])
- {
- printf("in %s gALL=%d\n", __func__,gALL);
- f();
- printf("agn in %s gALL=%d\n", __func__,gALL);
- return 0;
- }
- int f(void)
- {
- // 这里定义一个名字相同的变量, 那么全局的就被隐藏了
- int gALL = 1;
- printf("in %s gALL=%d\n", __func__,gALL);
- gALL += 8;
- printf("agn in %s gALL=%d\n", __func__,gALL);
- return gALL;
- }
- // in main gALL=12
- // in f gALL=1
- // agn in f gALL=9
- // agn in main gALL=12
四, 静态本地变量
在本地变量定义时加上 static 修饰符就成为静态本地变量
当函数离开的时候, 静态本地变量会继续存在并保持其值
静态本地变量的初始化只会在第一次进入这个函数时做, 以后进入函数时会保持上次离开的值
- #include <stdio.h>
- int f(void);
- int main(int argc, char const *argv[])
- {
- f();
- f();
- return 0;
- }
- int f(void)
- {
- static int all = 1;
- printf("in %s all=%d\n", __func__,all);
- all += 9;
- printf("agn in %s all=%d\n", __func__,all);
- return all;
- }
- // in f all=1
- // agn in f all=10
- // in f all=10
- // agn in f all=19
注意事项
静态本地变量实际上是特殊的全局变量
它们位于相同的内存区域
静态本地变量具有全局的生存期, 函数内的局部作用域
static 在这里的意思就是局部作用域 (本地可以访问)
五, 后记: 返回指针的函数
返回本地变量的地址是危险的
返回全局变量或静态本地变量的地址是安全的
返回在函数内 malloc 的内存是安全的, 但是容易造成问题
最好的做法是返回传入的指针
下面的写法就是很危险的
- #include <stdio.h>
- int* f(void);
- void g(void);
- int main(int argc, char const *argv[])
- {
- int *p = f();
- printf("*p = %d\n", *p);
- g();
- printf("*p = %d\n", *p);
- return 0;
- }
- int* f(void)
- {
- int i = 12;
- // 返回本地变量的地址是危险的
- return &i;
- }
- void g(void)
- {
- int k = 24;
- printf("k = %d\n", k);
- }
- //*p = 12
- // k = 24
- //*p = 24
- tips
不要使用全局变量来在函数间传递参数和结果
尽量避免使用全局变量
使用全局变量和静态本地变量的函数是线程不安全的
来源: http://www.bubuko.com/infodetail-3264396.html