网上在探讨C++内存分布的时候,大都是下面这种图,
外加上这么一句话:“栈区申请空间的地址(表示地址的八个十六进制数)是从大到小的,堆区申请空间地址是从小到大的。”
但是,小编编译器用x86和x64运行出结果恰好是相反的!
参考文章1:常规内存分布
参考文章2:栈堆地址高低次序测试1
int main()
{
printf("*************** 栈 ***************\n");
int a;
int b;
printf("a=%x,b=%x\n", &a, &b);
int d[10];
for (int i = 0; i < 10; i++)
{
printf("d[%d]=%x\n", i, &d[i]);
}
printf("*************** 堆 ***************\n");
int* c = new int;
printf("c=%x\n", c);
int* e = new int[10];
for (int i = 0; i < 10; i++)
{
printf("e[%d]=%x\n", i, &e[i]);
}
//delete c, c = nullptr;
int* f = new int;
printf("f=%x\n", f);
return 0;
}
32位测试结果
*************** 栈 ***************
a=f6fe70,b=f6fe64
d[0]=f6fe34
d[1]=f6fe38
d[2]=f6fe3c
d[3]=f6fe40
d[4]=f6fe44
d[5]=f6fe48
d[6]=f6fe4c
d[7]=f6fe50
d[8]=f6fe54
d[9]=f6fe58
*************** 堆 ***************
c=fd43f0
e[0]=fd9d60
e[1]=fd9d64
e[2]=fd9d68
e[3]=fd9d6c
e[4]=fd9d70
e[5]=fd9d74
e[6]=fd9d78
e[7]=fd9d7c
e[8]=fd9d80
e[9]=fd9d84
f=fd4420
64位测试结果
*************** 栈 ***************
a=c6d3f894,b=c6d3f8b4
d[0]=c6d3f8d8
d[1]=c6d3f8dc
d[2]=c6d3f8e0
d[3]=c6d3f8e4
d[4]=c6d3f8e8
d[5]=c6d3f8ec
d[6]=c6d3f8f0
d[7]=c6d3f8f4
d[8]=c6d3f8f8
d[9]=c6d3f8fc
*************** 堆 ***************
c=73d646a0
e[0]=73d72f70
e[1]=73d72f74
e[2]=73d72f78
e[3]=73d72f7c
e[4]=73d72f80
e[5]=73d72f84
e[6]=73d72f88
e[7]=73d72f8c
e[8]=73d72f90
e[9]=73d72f94
f=73d65d40
栈堆地址高低次序测试2
#include <iostream>
using namespace std;
//全局变量 未初始化
int g1;
int g2 = 0;
int g3 = 1;
int g4 = 2;
static int sg1 = 3;
int main(int argc, char* argv[])
{
static int s1 = 5;
cout << "memory address!" << endl;
//代码区 .text
cout << "代码区 main = " << main << endl;
cout << "全局未初始化 g1=" << &g1 << endl;
cout << "全局初始化为0 g2=" << &g2 << endl;
cout << "全局初始化为1 g3=" << &g3 << endl;
cout << "全局初始化为2 g4=" << &g4 << endl;
cout << "静态全局初始化为3 sg1=" << &sg1 << endl;
cout << "静态局部初始化为5 s1=" << &s1 << endl;
int* p1 = new int;
int* p2 = new int;
cout << "堆空间地址 p1=" << p1 << endl;
cout << "堆空间地址 p2=" << p2 << endl;
cout << "指针变量的栈空间地址 &p1=" << &p1 << endl;
cout << "指针变量的栈空间地址 &p2=" << &p2 << endl;
int i1 = 100;
int i2 = 101;
cout << "栈空间地址 i1=" << &i1 << endl;
cout << "栈空间地址 i2=" << &i2 << endl;
}
32位测试结果
memory address!
代码区 main = 00511267
全局未初始化 g1=0051C3E8
全局初始化为0 g2=0051C3EC
全局初始化为1 g3=0051C000
全局初始化为2 g4=0051C004
静态全局初始化为3 sg1=0051C008
静态局部初始化为5 s1=0051C010
堆空间地址 p1=01437670
堆空间地址 p2=01440AD8
指针变量的栈空间地址 &p1=00DFFDD0
指针变量的栈空间地址 &p2=00DFFDC4
栈空间地址 i1=00DFFDB8
栈空间地址 i2=00DFFDAC
64位测试结果
memory address!
代码区 main = 00007FF673F111E0
全局未初始化 g1=00007FF673F1F460
全局初始化为0 g2=00007FF673F1F464
全局初始化为1 g3=00007FF673F1F000
全局初始化为2 g4=00007FF673F1F004
静态全局初始化为3 sg1=00007FF673F1F008
静态局部初始化为5 s1=00007FF673F1F010
堆空间地址 p1=0000023D6104BDF0
堆空间地址 p2=0000023D6104AD80
指针变量的栈空间地址 &p1=000000F1E30FFA38
指针变量的栈空间地址 &p2=000000F1E30FFA58
栈空间地址 i1=000000F1E30FFA74
栈空间地址 i2=000000F1E30FFA94