关于 Linux c 程序的五大内存分区的疑问
一个典型的 C 程序的内存布局是以下几个分区(section)组成:
- 代码段(Text segment)
- 数据段(Initialized data segment)
- 未初始化的数据段(Uninitialized data segment)
- 堆(Stack)
- 栈(Heap)
对于这些分区的理解是:
代码段顾名思义储存的是二进制的可执行指令。数据段储存的是已初始化的内容,例如字符串,数字等,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,这块内存位于何处呢?