1 局部变量
普遍局部变量在一个函数内定义,只在函数范围内有效,在复合语句中定义,只在复合语句中有效,如果没有赋初值,内容为随机,生命周期为函数或复合语句结束。
static局部变量的作用域也是在定义的函数内有效,static局部变量的生命周期和程序运行周期一样,同时static局部变量的值只初始化一次,但可以赋值多次。static局部变量若未赋以初值,则由系统自动赋值:数值型变量自动赋初值0,字符型变量赋空字符。
2 全局变量
在函数外定义,可被本文件及其它文件中的函数所共用,若其它文件中的函数调用此变量,须用extern声明,全局变量的生命周期和程序运行周期一样,不同文件的全局变量不可重名。
Static全局变量在函数外定义,作用范围被限制在所定义的文件中
不同文件静态全局变量可以重名,但作用域不冲突。
3全局函数和静态函数
在C语言中函数默认都是全局的,使用关键字static可以将函数声明为静态,函数定义为static就意味着这个函数只能在定义这个函数的文件中使用,在其他文件中不能调用,即使在其他文件中声明这个函数都没用。对于不同文件中的staitc函数名字可以相同。
类型 | 作用域 | 生命周期 |
auto变量 | 一对{}内 | 当前函数 |
static局部变量 | 一对{}内 | 整个程序运行期 |
extern变量 | 整个程序 | 整个程序运行期 |
static全局变量 | 当前文件 | 整个程序运行期 |
extern函数 | 整个程序 | 整个程序运行期 |
static函数 | 当前文件 | 整个程序运行期 |
register变量 | 一对{}内 | 当前函数 |
4 内存分区
程序没有加载到内存前,可执行程序内部已经分好3段信息,分别为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分。
代码区是指令集合,通常共享只读。
全局初始化数据区/静态数据区
该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。
未初始化数据区
存入的是全局未初始化变量和未初始化静态变量。未初始化数据区的数据在程序开始执行之前被内核初始化为 0 或者空(NULL)。
程序在加载到内存前,代码区和全局区(data和bss)的大小就是固定的,程序运行期间不能改变。然后,运行可执行程序,系统把程序加载到内存,除了根据可执行程序的信息分出代码区(text)、数据区(data)和未初始化数据区(bss)之外,还额外增加了栈区、堆区。