| 生命周期 | 作用域 | 默认值 | 内存区域 | 链接属性 | ||
全局变量(定义在函数外部的变量) |
普通全局变量 | 程序运行开始创建,程序退出才销毁 | 从定义变量处到本文件结尾都能使用 |
0 | 全局变量区 | 外部(其他文件也能用) | |
静态全局变量 | 程序运行开始创建,程序退出才销毁 | 从定义变量处到本文件结尾都能使用 |
0 | 全局变量区 | 内部(只能本文件使用) | ||
局部变量 (定义在函数内部的变量,包括形参) | 普通局部变量 | 进入函数创建,退出函数销毁 | 函数内部或for循环内部等等 | 随机值 | 局部变量区 |
| |
静态局部变量(不常用) | 第一次执行该语句创建,程序结束才销毁 | 函数内部或for循环内部等等 | 0 | 全局变量区 |
| ||
动态内存 | 调用malloc()创建,free()销毁 |
| 随机值 | 堆 |
| ||
函数 | 普通函数(外部函数) |
|
|
| 代码段 | 外部(外部文件引用) | |
静态函数(内部函数) |
|
|
| 代码段 | 内部(内部文件引用) | ||
内存块 |
代码段 |
全局变量区 |
栈 |
堆 |
(上图并无逻辑关联)
1.全局变量:定义在函数外部的变量,如:
int g_a ; // 普通全局变量
static int g_sa; //静态全局变量
两者之间的区别在于链接属性(static修饰的是链接属性).
1_1:普通全局变量:可以被外部文件使用。当已经在同一个解决方案中的文件2中定义了普通全局变量(int g_a ;),么在文件1中可以通过(extern int g_a;)来引用它。
1_2:静态全局变量:只能被本文件使用。当在文件1中定义了静态全局变量(static int g_sa;)时,有在本文件中可以引用该变量,而在文件2中并不能通过(extern int g_sa;)来引用静态全局变量。
2.局部变量:定义在函数内部的变量,包括形参。如:
void Fun()
{
int a = 0;// 普通局部变量
++a;
printf("%d\n",a);
}
void Fun2 ()
{
static int a = 0;// 静态局部变量
++a;
printf("%d\n",a);
}
Int main()
{
For(int i=0;i<10;i++)
{
Fun();
Fun2();
}
}
2_1:普通局部变量:生命周期短,进入函数时创建、退出函数即销毁。作用域仅仅是在函数内部,存放在栈里,且初始值(未初始化)为随机值。在上述的程序当中,结果为输出十次的1.
2_2:静态局部变量:生命周期长,第一次执行语句时创建,程序结束时销毁。且作用域与局部变量相同,存放在全局(静态)变量区,且初始值为0。在上述的程序当中,结果为输出1~10.
3.动态内存:调用malloc()(还有calloc()和realloc())时创建,free()销毁.存放在堆中,且初始值为随机值。
4.函数:我们着重考虑它的内存区域和链接属性。
4_1:普通函数(外部函数):能够被外部文件引用。存放在代码段里,一般都写在.h文件里,可供外部文件使用。
4_2:静态函数(内部函数):只能被本文件引用。存放在代码段里,不想被外部函数使用,可以在函数声明部分的前头加上static (静态关键字)。