先把内存管理结构进行图像化
变量的生命周期
函数的生命周期
举例说明:
#includechar* a0="testa0"; char* a1; char b0[]="testb0"; char b1[2]; int c0=1; int c1; static int d0=2; static int d1; void test(){ char* e0="teste0"; char* e1; char f0[]="testf0"; char f1[2]; int g0=3; int g1; static int h0=4; static int h1; printf("e0= %016pn",e0); printf("e1= %016pn",e1); printf("f0= %016pn",f0); printf("f1= %016pn",f1); printf("g0= %016pn",&g0); printf("g1= %016pn",&g1); printf("h0= %016pn",&h0); printf("h1= %016pnn",&h1); } void main(){ printf("a0= %016pn",a0); printf("a1= %016pn",a1); printf("b0= %016pn",b0); printf("b1= %016pn",b1); printf("c0= %016pn",&c0); printf("c1= %016pn",&c1); printf("d0= %016pn",&d0); printf("d1= %016pnn",&d1); test(); char* i0="testi0"; char* i1; char j0[]="testj0"; char j1[2]; int k0=5; int k1; static int l0=6; static int l1; printf("i0= %016pn",i0); printf("i1= %016pn",i1); printf("j0= %016pn",j0); printf("j1= %016pn",j1); printf("k0= %016pn",&k0); printf("k1= %016pn",&k1); printf("l0= %016pn",&l0); printf("l1= %016pn",&l1); }
运行结果为:
a0= 0x00000000400820 //char* a0="testa0"; 数据区-常量区 a1= (nil) //char* a1; 空指针 b0= 0x00000000601040 //char b0[]="testb0"; 数据区-DATA区 b1= 0x00000000601074 //char b1[]; 数据区-DATA区 c0= 0x00000000601048 //int c0=1; 数据区-DATA区 c1= 0x00000000601070 //int c1; 数据区-DATA区 d0= 0x0000000060104c //static int d0=2; 数据区-DATA区 d1= 0x0000000060105c //static int d1; 数据区-DATA区 e0= 0x00000000400827 //char* e0="teste0"; 数据区-常量区 e1= (nil) //char* e1; 空指针 f0= 0x007fffa39d9bf0 //char f0[]="testf0"; 栈区 f1= 0x007fffa39d9be0 //char f1[]; 栈区 g0= 0x007fffa39d9bdc //int g0=3; 栈区 g1= 0x007fffa39d9bd8 //int g1; 栈区 h0= 0x00000000601050 //static int h0=4; 数据区-DATA区 h1= 0x00000000601060 //static int h1; 数据区-DATA区 i0= 0x000000004008e0 //char* i0="testi0"; 数据区-常量区 i1= 0x007fffa39d9d40 //char* i1; 栈区???:上面两个是空指针,这个为什么会初始化 j0= 0x007fffa39d9c40 //char j0[]="testj0"; 栈区 j1= 0x007fffa39d9c30 //char j1; 栈区 k0= 0x007fffa39d9c2c //int k0=5; 栈区 k1= 0x007fffa39d9c28 //int k1; 栈区 l0= 0x00000000601054 //static int l0=6; 数据区-DATA区 l1= 0x00000000601064 //static int l1; 数据区-DATA区 //可以看出a1,e1是空指针 //a0,e0,i0在低地址区域低区 //b0,b1,c0,c1,d0,d1,h0,h1,l0,l1在低地址区域高区 //f0,f1,g0,g1,i1,j0,j1,k0,k1 在高地址区 //a0,e0,i0是递增的 //b0,c0,d0,h0,l0是递增的 //b1,c1,d1,h1,l1是有规律的递增 //a0,e0,i0的地址整体比在b0,c0,d0,h0,l0小,说明常量区比DATA区低 //b0,c0,d0,h0,l0的地址整体比b1,c1,d1,h1,l1小,说明DATA区比BSS区低 //f0,f1,g0,g1,i1,j0,j1,k0,k1是递减的,说明栈区是由高向低开辟空间的
上面的结果验证了上面的内存管理模型 ,不同的变量存储在不同的位置
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)