这儿所讨论的是x86机器下的内存分配。其他机器下的情况可能不一样。
首先,下面是一段测试程序:
#include <cstdio>
using namespace std;
int main(){
int a[]={1,2,3,4,5,0,-5,-4,-3,-2,-1};
char *s="hello world";
char *s2="I'm a boy";
char *s3="hello world";
float f=1.0f;
double d=1.0;
printf("a :%0#x\n",a);
printf("s :%0#x\n",s);
printf("s2:%0#x\n",s2);
printf("s3:%0#x\n",s3);
printf("f :%0#x\n",&f);
printf("d :%0#x\n",&d);
printf("main:%0#x\n",main);
return 0;
}
using namespace std;
int main(){
int a[]={1,2,3,4,5,0,-5,-4,-3,-2,-1};
char *s="hello world";
char *s2="I'm a boy";
char *s3="hello world";
float f=1.0f;
double d=1.0;
printf("a :%0#x\n",a);
printf("s :%0#x\n",s);
printf("s2:%0#x\n",s2);
printf("s3:%0#x\n",s3);
printf("f :%0#x\n",&f);
printf("d :%0#x\n",&d);
printf("main:%0#x\n",main);
return 0;
}
程序运行结果如下:
从上面的图中可以看到几点:
-
三个字符串s,s2和s3的地址最高。高于main函数。
-
其他三个变量整型数组a,float变量f和double变量d的地址是变化为从高到低
我们可以推断得到:在x86的机器上,程序的内存增长的方向是由高地址到低地址。三个字符串s,s2和s3是在静态区域分布的,所以内存位置比较高。三个局部变量a,f和d是在栈上进行内存分配的(栈的增长方向也是从高地址到低地址)
数组a在内存中的分布:
int a[]={1,2,3,4,5,0,-5,-4,-3,-2,-1};
因为x86的机器是小端,字节的低位存储在低位地址上,所以出现这样的存储。图中红色方框标出的就是数组中的每一个数字,都是4个字节的。其中-5,内存表示为0xfffffffb,就是第一行最右边和第二行最左边。可以看到数组第一元素的地址是0x0023fe58,低于最后一个元素的地址0x0023fe80.
如果用真实的内存方式展示的话,数组类似下面的分配方式:
该数组为:int i, a[]={1,2,3,4,5};
字符串s,s2和s3在内存中:
由于字符串s和s3 的内容是一致的,而这种字符串时分配在静态区域的,所以,两者指向了同样的地址位置。