堆栈的详解

来源:互联网 发布:java与或非逻辑符号 编辑:程序博客网 时间:2024/05/16 03:53

一,程序占用的内存分为五个部分:

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];

}

 

原创粉丝点击