首先我们给出内存布局

高内存地址
栈
向下增长,可读可写可执行
空洞
向上增长
堆
向上增长,可读可写可执行
BSS段(未初始化数据段)
向上增长,可读可写不可执行
.data数据段
向上增长,可读可写不可执行
.text文本段(代码段)
向上增长,可读可写不可执行
低内存地址

不同类型的变量在内存中的位置:
1,局部变量、函数参数存放在栈上。静态局部变量,并不是在调用函数时分配,在函数返回时释放,而是像全局变量一样静态分配在.data数据段,但它的作用域只在函数中起作用。
2,堆,给动态分配内存使用。
3,全局变量、静态变量位于.data数据段;未初始化变量则位于.bss未初始化数据段。
4,const修饰的全局变量在.rodata只读数据段(const变量在定义时必须初始化,如果未初始化将被设为0或空),只读数据段在和.text同一个segment
5,代码段即存储程序文本。