栈存储区
那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆存储区(*存储区)
那些由new或者malloc分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。这种变量的存储区域是在变化的。
全局/静态存储区
全局变量以及静态变量(static)存储的区域
常量存储区
这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
还要说明的一点是常变量和普通变量对应的内存分配是一样的,只不过系统会对该变量进行“保护”,不让它被改变。
通过一个程序来说明:
#include<cstdio> #include<cstdlib> using namespace std; int b=0; int main() { int a1=0; const int a2=1; static int b1=0; const static int b2=0; char *c="123"; char *d="2234"; int *p1=new int; int *p2=(int *)malloc(sizeof(int)); printf("栈区域:\n%d\n%d\n",&a1,&a2); printf("堆区域:\n%d\n%d\n",p1,p2); printf("全局\静态变量存储区:\n%d\n%d\n%d\n",&b,&b1,&b2); printf("常量存储区:\n%d\n%d\n",&c[0],&d[0]); return 0; }
结果输出:
栈区域:
2293404
2293400
堆区域:
6054168
6054184
全局静态变量存储区
4337696
4337700
4325472
常量存储区:
4325376
4325380
通过多次运行可以发现,堆区的地址是在不断变化的……