进程映像
程序:存储在磁盘中的可执行文件(二进制文件,文本文件) 进程:在系统中运行的程序 进程映像:进程的内存的分布情况
进程的内存分布
text 代码段:
存储的是二进制指令、常量(字符串字面值),该内存段的权限为只读,一旦强行修改就会产生段错误。
data 全局数据段:
里面存储着初始化过的全局变量、静态变量。
bss 静态数据段:
里面存储着末初始化过的全局变量、静态变量,该内存段在程序执行前会被初始化为0。
heap 堆:
由于程序员手动管理,该内存无法与标识符建立映射关系(无法取名字),必须与指针配合使用。 优点:够大,分配和释放可控。 缺点:使用麻烦,容易产生内存泄漏、内存碎片。
stack 栈:
由系统自动管理,随着函数被调用,会自动分配内存,函数执行结束后自动释放内存。 优点:使用方便,采用栈结构方式管理安全,不会产生内存泄漏、内存碎片。 缺点:大小有限
全局变量和局部变量,块变量
全局变量: 定义在函数外的 存储位置: data(初始化过的)或者bss(未初始化过的) 生命周期: main函数运行开始前到程序结束才释放 作用范围: 程序中的任何位置
局部变量: 定义在函数内的 存储位置: stack栈内存 生命周期: 函数的定义语句开始,直到函数执行结束 作用范围:只能在本函数内使用
块变量: 定义在if\for\while等语句块内的变量 存储位置: stack栈内存 生命周期: 函数的定义语句开始,直到函数执行结束 作用范围:只能在语句块内使用
注意:局部变量和全局变量可以同名,但是会屏蔽同名的全局变量,同名块变量会屏蔽同名的局部变量和全局变量
类型限定符
auto: 早期用于定义临时变量(局部变量和块),C11标准中它可以用于定义自动推导类型的变量。
const: 显示的“保护”变量不被修改,const int num=10(可以用指针修改地址),若对 初始化过的全局变量修饰,则其存储位置从data段转移至text段(相当于常数)。
static: 被static修饰过的变量称为静态局部变量,局部全局变量
改变存储位置: 改变局部变量的存储位置,由stack改data或者bss(由是否初始化决定) 延长生命周期: 延长局部变量的生命周期,程序运行前到程序运行结束,不会随着函数的执行结束而释放。 限制作用范围: 限制全局变量、函数只能在本文件内使用 可以防止函数、全局变量重名、防止被别人调用
volatile: 编译器的取值优化,使用volatile修饰的变量不做取值优化
volatile int num = 10;
if(num == num)
{
}
Register: 申请把变量的存储介质由内存转移到寄存器存储,如果能成功,数据的读取速度会大幅提升,寄存器数量有限,申请可能失败 Extern: 声明外部的全局变量,声明的变量已在别处定义过,请放心使用 但是只能临时通过编译,如果没有定义,链接时依然会报错 只是声明变量,不能赋值 Typedef 类型重定义,注意不是替换关系,定义变量时如果前面加上typedef,则变量名就变成了类型 typedef int num;
|