C语言中程序储存时的内存分配与程序运行时的内存分配
https://blog.csdn.net/ljianhui/article/details/21666327
https://blog.csdn.net/youoran/article/details/10990815
1. 可执行程序在存储时的内存分配 高 (3)BSS段 (.bss ):未初始化数据区,存入的是全局未初始化或初始化为0的变量 ↑ (2)数据段(.data):全局初始化数据区/静态数据区,包含在程序中初始化了的全局变量/静态变量/常量数据 低 (1)代码段(.text):存放CPU执行的机器指令 2. 程序运行时所占用的内存分配 (1)代码段:存放可执行的程序代码; 代码区的指令中包括操作码和要操作的对象(或对象地址引用)。 如果是立即数(即具体的数值,如5),将直接包含在代码中; 如果是局部数据,将在栈区分配空间,然后引用该数据地址; 如果是BSS区和数据区,在代码中同样将引用该数据地址。 (2)数据段:只初始化一次 (3)BSS 段:未初始化数据区,在运行时会改变其值 (4)栈 区:由编译器自动分配释放,存放函数参数值和局部变量的值等; 其操作方式类似于数据结构-栈,当在代码段中运行到被调函数,其局部变量在栈区分配空间再将值压栈push 在代码段留下局部变量在栈中的地址,当被调函数返回时,栈区的数据将释放即出栈pop,或要返回局部变量, 会将局部变量的值复制一份给主调函数。 (5)堆 区:用于动态内存分配;位于bss段和栈区之间,一般由程序分配和释放或由OS回收; 3. 内存分配分成多区域的原因: 程序运行时,会多次访问数据,为数据单独开辟空间可以方便访问与节省空间