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