堆栈的详解

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

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

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值