一,程序占用的内存分为五个部分:
1.栈区 由编译器自动分配,储存函数的参数值以及局部变量,类似于数据结构 栈
2.堆区 由程序员申请分配。
3.全局区即静态区 存放全局变量以及静态变量
4.常量区 常量字符串等
5.程序代码区 存放函数体的二进制代码
举例:
二, 内存操作区别
案例1: 静态区和栈区
char* p = “Hello World1”;
char a[] = “Hello World2”;
p[2] = ‘A’;
a[2] = ‘A’;
char* p1 = “Hello World1”;
此代码有错。此处的变量指针p p1 以及数组a都放在栈区,而数据“Hello World2”与“Hello world1”放在不同区域,前者是栈区后者为堆区。此处p[2]可以访问数据即为字母l,但不能修改,所以p[2]='A';表达式会报错。
案例二:堆区和栈区
char* f1()
{
char* p = NULL;
char a;
p = &a;
return p;
}
char* f2()
{
char* p = NULL:
p =(char*) new char[4];
return p;
}
两者中指针变量 p 都是临时变量,函数调用结束后便会释放掉。但是后者因为人为开辟了一段空间,故而函数调用完后,只要所开辟的空间的首地址还保存,就可以访问此空间中的数据。堆开辟的空间全局可以共享。
但是避免以下错误出现:即堆区开辟的空间首地址没有保存,也没有delete人为释放该内存,此做法将会引起内存泄露
void f()
{
…
char * p;
p = (char*)new char[100];
…
}