程序是指存储在磁盘上的可执行文件(二进制文件、脚本文件);
进程是指在系统中进行中的程序;
进程映像:指进程内存的分布情况,主要存储区域有以下几个:
Text 代码段(只读段)
存储二进制指令、常量数据(只读),强制修改会发生段错误(非法访问内存)
data 数据段
初始化的全局变量、初始化的静态局部变量;
bss静态数据段
未初始化的全局变量,未初始化的静态局部变量,在程序开始时会默认清零
stack 栈
局部变量、块变量,由操作系统管理,能自动申请和释放,内存还会随时增加和减小,十分方便;但空间较小;
heap 堆
由程序员手动管理,优点是空间足够大,但申请和释放都需要手动进行,比较麻烦。
变量的分类:
局部变量
定义在函数内的变量;(建议小写)
存储位置:stack 栈内存;
生命周期:从函数调用到函数的结束;
作用范围:只能在函数内使用
全局变量
定义在所有函数外的变量;(建议首字母大写)
存储位置:data或dss(取决于变量是否有初始化);
生命周期:从程序开始到程序结束;
作用范围:在程序内任意位置(其他文件也可使用);
块变量
定义在语句块的变量 if/for/while
存储位置:stack 栈内存;
生命周期:从函数调用到函数的结束;
作用范围:只能在语句块内使用
注意:
当局部变量和全局变量同名时,函数内会屏蔽同名全局变量;
当块变量和局部变量、全局变量同名时,函数内会屏蔽同名全局变量和局部变量
类型限定符:
Auto:
自动分配内存、释放内存的变量,在C语言中一般用不到,但在C11中用于自动识别类型,可根据赋值自动改变类型;
全局变量不能用auto修饰;
在C11中用于自动识别类型,可根据赋值自动改变类型;
Extern
申明变量 告诉编译器该变量已经在别处定义过了;(防止报错)
格式:
extern int Num;(接申明)
一般在多文件编程中使用*
Static
被它修饰的局部变量称为静态局部变量,有以下几个改变:
1、 延长生命周期
延长局部变量的生命周期至进程结束;
2、限制作用范围
限制全局变量和函数的作用范围,只能在本文件内使用;
防止全局变量、函数命名冲突,也防止被其他文件使用。
3、改变变量的存储位置
改变局部变量的存储位置,从stack改为data或bss 取决于是否初始化 (初始化为0的变量也会存到bss)
Const
“保护”变量的值不能被显式地修改
但是可以通过访问内存来修改;
如果修饰了初始化的全局变量或初始化后的静态局部变量,则该变量存储位置会从data改为text,变成了“常量”,无法强制修改
Volatile
被修饰的变量不再进行取值优化,每次调用都会去寄存器读取;
Volatile int num;
if(num===num)
上述语句不一定一直为真,因为可能在两次读取num值的过程中因为外部因素导致寄存器的值发生了改变。
Register
申请把变量的存储介质由内存改为寄存器,由于寄存器数量有限,申请不一定成功。
寄存变量不能取地址
Typedef
类型重定义
定义变量时如果在类型前加上,变量名就变成了这个类型的新类型名,并不是替换关系