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

测试结果截图

先确认一下这里“低地址高地址”的定义,这里并不是指的大端小端中的地址高低,而是内存中的地址,如下:

 
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,和上面栈的情况一样。

 

posted @ 2012-05-26 12:06  hktkhhhh  阅读(534)  评论(0)    收藏  举报