首页 > 其他分享 >栈和堆的区别以及栈数组和堆数组的区别

栈和堆的区别以及栈数组和堆数组的区别

时间:2023-01-14 20:44:26浏览次数:112  
标签:count 字节 以及 int 区别 v2 数组 new

​ 这里写得很简洁,实际上堆的机制比较复杂,我详细地学习了 Windows 下的堆管理机制,如果对这部分感兴趣的话,可以参考我的另一篇文章:https://www.cnblogs.com/XiuzhuKirakira/p/16986744.html

栈和堆的区别

1)生命周期

栈:生命周期在被调用函数内,不调用函数就不生成栈
堆:生命周期由程序员决定,new出现,delete消亡

2)初始化

栈在内存中被初始化为: 0xcccccccc
堆在内存中被初始化为: 0xcdcdcdcd (也没有这么绝对,此处的堆特指使用 new 申请的内存块,且为 Debug 状态)

对于堆(heap),若 int *v1 = new int[2]; 则在内存空间中应是:

0xFDFDFDFD
0xCDCDCDCD
0xCDCDCDCD
0xFDFDFDFD

注意
一个进程可以有若干栈[][][][],但是只有一个堆[ [] [] ] 即进程默认堆

栈数组和堆数组的区别

1)栈数组的内存在栈上,而堆数组需要从栈数组上的一个内存去访问堆上的内存

如下:

int v1[] = { 1,20,3,-1 };//16个字节
int *v2 = new int[4];//栈上4/8个字节,堆上16个字节

2)地址分布
低地址
栈 ebp esp

代码段 .txt
数据段 .data .rdata
高地址

3)栈数组数组名不能被修改,堆数组名可以

	int v1[] = { 1,20,3,-1 };//栈上16个字节
	int *v2 = new int[4];//栈上4/8个字节(在栈上只是一个指针,在 x86 系统下指针字节为 4,在 x64 系统下指针字节为 8),堆上16个字节
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		*v2 = v1[i];
		v2++;//改变不会报错,但如果后面不改回去,delete程序就会崩溃
	}
	v2--; 
	v2--;
	v2--;
	v2--;
	if (v2 != NULL)
	{
		delete v2;
	}

4)对于栈,堆数组使用sizeof,结果不一样

	cout << sizeof(v1) << endl;//输出16
	cout << sizeof(v2);//输出4或8

5)堆相对于栈而言,更利于用户的友好界面

	_tprintf(_T("How Many\r\n"));
	int count = 0;
	int*v3;
	_tscanf_s(_T("%d"), &count);
	if (count == 0 || count > 10)
	{
		return;
	}
	else
	{
		v3 = new int[count];
	}

标签:count,字节,以及,int,区别,v2,数组,new
From: https://www.cnblogs.com/XiuzhuKirakira/p/17052503.html

相关文章

  • 遍历打印数组在一行 实例
    一行打印数组packagecom.fqs.demo;publicclassChongZ{//数组遍历遍历显示整个数组显示在一行//publicstaticvoidmain(String[]args){......
  • C++中如何将一行字符串(一行字符串可带空格)输入到string对象中或者字符数组中?
    提供两种方法:①、使用cin的成员函数getline,代码如下:charstr1[20];cin.getline(str1,20);     //第一个参数代表字符数组的指针,第二个参数代表写入的最大长度②、......
  • 栈、队列以及环形缓冲区
    栈和队列,都可以不通过指定地址和索引来对数组的元素进行读写。需要临时保存计算过程中的数据、连接在计算机上的设备或者输入输出的数据时,都可以通过这些方法来使用内存。......
  • 数组是高效使用内存的基础
    数组是指多个同样数据类型的数据在内存中连续排列的形式。作为数组元素的各个数据会通过连续的编号被区分开来,这个编号称为索引(index)。指定索引后,就可以对该索引所对应地......
  • BBS项目文章详情页点赞点踩以及评论
    目录BBS项目文章详情页点赞点踩以及评论一、编写思路概览二、编写思路详细1.开设一个全新的路由2.写视图函数3.写文章详情页前端页面4.开设文章点赞点踩以及评论路由5.写点......
  • SA后缀数组
    SA后缀数组sa数组:sa[i]=x表示对于所有的后缀进行排序(字典序)后,得到排名为i的以第x个字符开头的后缀rk数组:rk[x]=i,是对于所有的后缀进行排序(字典序)后,得到以第x个字符......
  • 【Redis实战专题】「性能监控系列」全方位探索Redis的性能监控以及优化指南
    Redis基本简介Redis是一个开源(BSD许可)、内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合等数据类型。内置复......
  • solidity部分修饰符的使用以及合约的部分调用方法
    Viewpure修饰符:使用view与pure不需要gweiview:不能修改链上数据只能访问pure:不能访问链上数据,被修饰的方法里的变量只能在方法内使用contract ViewPureExample{ ......
  • 利用lodash对(对象)数组去重
    使用场景:根据数(对象)组中的id或者其他属性去重,或者对象中的所有属性值相同的去重。传统方法:通过数组的some进行逐项判断;用了lodash之后发现还是很香的。import{isEqual......
  • C语言中~与!的区别
    !是逻辑非or否定​凡是a的值不为0的,!a就等于0;​如果a的值为0,则!a的值为1而~这个是按位取反比如inta=2;用二进制表示为00000010;则!a=0......