堆,栈,全局变量的地址分配,(代码测试)

先确认一下这里“低地址高地址”的定义,这里并不是指的大端小端中的地址高低,而是内存中的地址,如下:
00421ae0为相对低地址,00421ae8为相对高地址.
这个我的测试代码:
#include "iostream"
using namespace std;
int global1;
int global2;
struct Node
{
int m;
};
int main()
{
int stack1;
int stack2;
Node *heap1=new Node();
Node *heap2=new Node();
cout<<"global address:"<<endl;
cout<<" global1 "<<&global1 <<endl;
cout<<" global2 "<<&global2 <<endl;
cout<<"stack address:"<<endl;
cout<<" stack1 "<<&stack1 <<endl;
cout<<" stack2 "<<&stack2 <<endl;
cout<<"heap address:"<<endl;
cout<<" heap1 "<<heap1 <<endl;
cout<<" heap2 "<<heap2 <<endl;
cout<<"Point address:"<<endl;
cout<<" Heap point1"<<&heap1<<endl;
cout<<" Heap point1"<<&heap2<<endl;
return 0;
}
测试结果如上图所示
详细分析代码
1.全局变量
int global1;
int global2;
这是两个全局变量
地址
global1 01089138
global2 0108913c
可以看到后声明的全局变量global2 地址大于先声明的全局变量global1,而且两个地址相差4,
刚好为这个全局变量的类型大小,此处为int型。
结论:先定义的全局变量位于低地址,后定义的位于高地址。
2.栈中变量
(栈中变量指的是由编译器自动分配释放的变量)
stack1 0016F79C
stack2 0016F790
由于变量位于栈中,先声明的stack1的地址大于后声明stack2的地址,因为这个栈类似数据结构中的栈。
注意:这里两个地址的相差12,本以为应该是一个int型的大小4(先前声明这个临时变量为int),一直没有搞懂是什么原因?希望大家指教
结论:由于栈是往低地址生长的,所以先声明的变量位于高地址。
3.堆中变量
(堆中变量指的是由程序员分配释放的变量,例如new,malloc)
heap1 005A77A0
heap2 005A77D0
先声明的heap1的地址小于后声明的heap2的地址,
注意:这里heap2的地址要大于heap1 3*16=48个内存空间,不知道为什么差这么多?不是连续的吗?
结论:由于堆是往高地址生长的,所以先声明的变量位于低地址。
最后捎带的做了下指针的地址分配情况测试
Heap point1 016F784
Heap point2 0016f778
point1的地址大于point2的地址。
一个指针的地址空间是4,和int的大小一样,
指针的地址存储在栈中,所以这里这里相邻两个指针的地址相差了12,和上面栈的情况一样。

浙公网安备 33010602011771号