C++中内存的分配问题


 

最近看到递归问题,很多递归都和堆栈有关,于是就看了下关于C++内存分配的知识

在C++中,内存分成5个区,他们分别是堆、栈、代码区、全局/静态存储区和常量存储区

 

图中将代码区和常量存储区归并到只读代码了

 

     栈:编译器自动分配释放,一般存放函数参数值,局部变量

     堆:是唯一由程序员管理的内存区域,如C中的malloc ,free, C++中的 new,delete

     代码区:存放函数体(类成员函数和全局函数)的二进制代码

     全局/静态存储区:如在函数中用static声明的,或者在程序开头声明的,在编译时就开辟好内存

     常量存储区:如char *p="Hello World";  (虽然由系统管理,但是作用域是贯穿于整个程序的,这点比较重要)

 

     程序分析:

#include<iostream>
using namespace std;
char* fun()
{
	char str[]="hello world!";
	return str;
}
int main(void)
{
	char *pStr;
	pStr=fun();
	cout<<pStr<<endl;
	return 0;
}

  程序结果:

  原因:出现乱码-----str中的内容是保存在栈中的,当fun结束,系统自然就收回在栈中的内存了

 

#include<iostream>
using namespace std;
char* fun()
{
	char *str="hello world!";
	return str;
}
int main(void)
{
	char *pStr;
	pStr=fun();
	cout<<pStr<<endl;
	return 0;
}


 

程序结果:

原因:怎么会出现Hello World呢疑问

        由于Hello World不能通过*str改变的,所以为文字常量,是存储在常量存储区的,而他的作用域是贯穿于整个程序的

 

 

从这里我们看出数组和指针是不相等的str[]、*str,可在网上甚至在课堂上经常出现

数组=指针

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值