深度剖析程序中的内存布局

第一点:1.需要明白的是C语言中一切的操作都是基于内存的(其实其他编程语言本质也是基于内存的,像C/C++这种语言是直接基于内存的,没有垃圾回收机制,所以经常造成内存泄漏,然后现在很多高级语言例如Java,Python等都有内存回收机制。)像变量名和数组名都是内存的别名,内存分配是有编译器在编译期所决定,定义数组也必须指定数组的长度,数组的长度也是在编译期所决定的。2.堆是动态内存分配,是程序运行过程中,如果需要一片内存空间,这个时候程序就可以相内存池申请一片内存归自己所用。3.静态存储区里面所存储的变量也是编译的时候就可以确定大小的,然后到程序运行的时候才分配内存空间的。静态存储于主要用于保存全局变量和静态局部变量。

上图为不同的代码在可执行程序中对应的关系。首先观察右边是可执行程序中的各个段。观察他们之间的对应关系为:1.对于已经初始化了的全局变量和静态局部变量存放在.data段。2.对于没有初始化的全局变量和静态局部变量存放在.bss段,对于函数的声明和调用存放在.text段。是不是有一点很好奇,int a=3,int b;这2个局部变量存放在哪呢?他们是局部变量是要等到程序运行之后(变成进程)存放在栈空间上的。在可执行程序中是没有栈和堆空间的,只有等到可执行程序变成了进程之后才有栈和堆的。

 

posted @ 2019-09-20 19:32  repinkply  阅读(30)  评论(0)    收藏  举报