周日讲了32位linux下的内存分布
还有关于C语言中的extern和static的用法
内存的最高1G是用作系统保留,接下来是占空间,在靠近3G的那一块
再下来是堆空间,之后是bss区,未初始化的静态变量区
然后是Rw data区
Ro data区,主要用作存储字符串类型
接下来是代码段,又名txt正文段
0xffffffff 内核 |
0xbfff ffff 栈 |
堆 |
bss区 |
rw data |
ro data |
代码段 0x00000000 |
接下来就是验证
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 3 static int sg_init = 10; 4 static int sg_uninit ; 5 6 7 int main() 8 { 9 10 int l_init = 10; 11 static int init_stack = 10; 12 static int uninit_stack; 13 static int uninit_xxx = 0; 14 15 printf("sg_init %p ",&sg_init); 16 printf("sg_uninit %p ",&sg_uninit); 17 printf("l_init %p ",&l_init); 18 printf("init_stack %p ",&init_stack); 19 printf("uninit_stack %p ",&uninit_stack); 20 printf("string,ro data %p ","hello"); 21 printf("function %p ",main); 22 23 }
运行结果如下
sg_init 0x804a014
sg_uninit 0x804a024
l_init 0xbfa0718c
init_stack 0x804a018
uninit_stack 0x804a028
string,ro data 0x80485da
function 0x80483e4
可见局部变量是存放在栈空间的,因为比较靠近堆空间0xbf
未初始化的静态全局变量和静态局部变量是紧挨着的,而且比初始化的位置要高一些,所以验证了上述模型
rodata段爷比rwdata段要低一些,说明静态区的模型也是正确的
同理代码段的地址也是符合上述模型。
有个不太严谨的证明是局部变量栈空间,如何排除它不是在堆空间?栈空间有多大?
我这里还没搞明白。