
#include <stdio.h> #include <stdlib.h> #include <time.h> int gloUninit1; int gloUninit2; int gloInit1 = 1; int gloInit2 = 1; char * pStr1 = "Hello"; char * pStr2 = "World"; char * pStr3 = "Hello"; char * pStr4 = "more"; const int con = 1; char str[] = "Hello"; int Fun1(int a) { return a; } int Fun2(int a) { return a; } int main() { int (*pFun1)(int a); int (*pFun2)(int a); pFun1 = Fun1; pFun2 = Fun2; char * pStr5 = "this"; printf("gloUninit1 address: %d\n\ gloUninit2 address: %d\n\ gloInit1 address: %d\n\ gloInit2 address: %d\n\ const address: %d\n\ pStr1(hello): %d\n\ pStr2(world): %d\n\ pStr3(hello): %d\n\ Str(hello): %d\n\ Fun1 address: %d\n\ Fun2 address: %d\n\ pStr1(hello) address: %d\n\ pStr2(world) address: %d\n\ pStr3(hello) address: %d\n\ Str(hello) address: %d\n",&gloUninit1,&gloUninit2,&gloInit1,&gloInit2,&con,pStr1,pStr2,pStr3,str,pFun1,pFun2,&pStr1,&pStr2,&pStr3,&str); printf("(this)%d\n","this"); printf("(more)%d\n","more"); printf("(did)%d\n","did"); return 0; }
程序输出结果:
可以看出在内存低位的是函数地址,也就是text段。
紧接着text段的就是data段,可以看到初始化的全局变量按顺序排列开来,从gloInit1一直到Str,因为都是四字节的变量,可以看到内存地址也是按照4字节递增。
在往上就是常量区域了,常量con以及Hello,World,more,this这四个字符串的地址,可以看出编译器将相同的字符串优化到一处,所以pStr1和pStr3,pStr4和“more”的地址都是一样的,pStr1和pStr2相差6字节正好是“Hello”字符串长度,亦可以看出在分配int型常量con时进行了内存对齐。这里比较奇怪的是“did”字符串,依然在bss段之下,却和前几个字符串间隔了一段距离,和“this”的差别在于this之前有赋值给pStr5,有谁知道原因还望提点一二。
在往上就是bss段了。未初始化的全局变量存放在这里。
堆内存动态申请分配,栈由操作系统控制,分布如图示