一个典型的 C 程序的内存布局是以下几个分区(section)组成:
对于这些分区的理解是:
代码段顾名思义储存的是二进制的可执行指令。数据段储存的是已初始化的内容,例如字符串,数字等,ex.char s [] =“ hello world”;
。未初始化的数据段,声明一个全局变量但不赋值,将存储在 bss 段,static int i;
。程序员 malloc/new 的区域会在堆上,堆可伸缩,同时会产生大量的碎片内存。栈的结构是 LIFO 的结构,存储着临时变量,指针,由 OS 进行管理。数据段和代码段是在可执行文件中,运行时由 OS 读取到内存中的。BSS 段不在可执行文件中,可执行文件中 BSS 段仅仅是一个数字,标记所有未初始化的变量占用空间的总和。在读取可执行文件时,OS 在数据段旁边,开辟这些区域并将它们赋值为 0 。
这是我的理解,有错误的地方还请指教。以下是我的问题:
如果一个未初始化的变量定义如,static int i;
,然后用 malloc 进行分配,这块内存位于何处呢?还有如char s [];
,从硬盘读取文件内容到内存,应该会在堆区,然后赋值给s
,这块内存位于何处呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.