C语言,栈区、堆区、静态数据区、常量区、代码区 解析

C语言,栈区、堆区、静态数据区、常量区、代码区 解析,第1张

C语言,栈区、堆区、静态数据区、常量区、代码区 解析

先把内存管理结构进行图像化

变量的生命周期

函数的生命周期

举例说明:

#include

char* 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是递减的,说明栈区是由高向低开辟空间的

上面的结果验证了上面的内存管理模型 ,不同的变量存储在不同的位置

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5650769.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存