C语言入门-全局变量
程序员文章站
2022-03-20 16:54:52
一、全局变量 1. 定义在函数外面的变量是全局变量 2. 全局变量具有全局的生存期和作用域 3. 它们与任何函数无关,在任何函数内部都可以使用它们 二、全局变量初始化 1. 没有做初始化的全局变量会得到0值 2. 指针会得到NULL值 3. 只能用编译时刻已知的值来初始化全局变量 4. 它们的初始化 ......
一、全局变量
- 定义在函数外面的变量是全局变量
- 全局变量具有全局的生存期和作用域
- 它们与任何函数无关,在任何函数内部都可以使用它们
#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
- 不要使用全局变量来在函数间传递参数和结果
- 尽量避免使用全局变量
- 使用全局变量和静态本地变量的函数是线程不安全的