进程的逻辑内存空间
共享库和 mmap 内存映射
数据段 (全局static和本地static,全局变量)
代码段
堆(malloc ,引用)
栈 (本地变量,所以这个会是个随机数)
测试用程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static int static_glob = 0;
int int_glob = 0;
int main()
{
int int_local;
static int static_local = 0;
int *pa = malloc(sizeof(int));
*pa = 0;
printf("local int %p\n", &int_local);
printf("glob int %p\n", &int_glob);
printf("glob static %p\n", &static_glob);
printf("local static %p\n", &static_local);
printf("local pa %p\n", pa);
while(1) sleep(1);
return 0;
}
</unistd.h>
</stdlib.h>
</stdio.h>
proc 下的进程 Id 下的 maps 文件可以见到内存的分配
heap 堆
stack 栈
数据区
代码区之类
$ cat /proc/13458/maps 007a6000-007a7000 r-xp 00000000 00:00 0[vdso] 00c84000-00ca0000 r-xp 00000000 08:06 914742/lib/i386-linux-gnu/ld-2.13.so 00ca0000-00ca1000 r--p 0001b000 08:06 914742/lib/i386-linux-gnu/ld-2.13.so 00ca1000-00ca2000 rw-p 0001c000 08:06 914742/lib/i386-linux-gnu/ld-2.13.so 00e86000-00fe0000 r-xp 00000000 08:06 914755/lib/i386-linux-gnu/libc-2.13.so 00fe0000-00fe1000 ---p 0015a000 08:06 914755/lib/i386-linux-gnu/libc-2.13.so 00fe1000-00fe3000 r--p 0015a000 08:06 914755/lib/i386-linux-gnu/libc-2.13.so 00fe3000-00fe4000 rw-p 0015c000 08:06 914755/lib/i386-linux-gnu/libc-2.13.so 00fe4000-00fe7000 rw-p 00000000 00:00 0 08048000-08049000 r-xp 00000000 08:07 132093/home/fukai/C/4 08049000-0804a000 r--p 00000000 08:07 132093/home/fukai/C/4 0804a000-0804b000 rw-p 00001000 08:07 132093/home/fukai/C/4 09757000-09778000 rw-p 00000000 00:00 0[heap] b76ff000-b7700000 rw-p 00000000 00:00 0 b7711000-b7714000 rw-p 00000000 00:00 0 bfd61000-bfd82000 rw-p 00000000 00:00 0[stack]
程序执行的结果
$ ./4localint 0xbfd810b8 stack 栈 globint 0x804a024 data 全局 glob static 0x804a028 data 全局static local static 0x804a02c data 本地static local pa 0x9757008 heap 堆 引用