对于编程初学者来说,会接触到一些难以理解的名字,比如堆(heap)、栈(stack)、栈(stack)等,在初学者的开发过程中往往会让人一头雾水。 今天我们就来说说堆和栈的具体区别,帮助初学者理清思路。

堆和栈的区别一直是一个永恒的话题。 为此,我也查了很多资料,防止自己的理解有误,给别人造成理解上的偏差。

我们先从一个简单的例子来介绍一下堆和栈:

无效函数(){

int *p = (int *)malloc(10*sizeof(int));

}

c语言堆和栈的区别_c语言堆和栈的区别_c 堆和栈的区别

堆和栈

我们从以下几个方面比较堆和栈:

1个

存储内容不同

栈:调用函数时,函数中的每个参数(局部变量)(函数调用后的下一条指令)都存放在栈中。

堆:一般在堆的头部用一个字节存储堆的大小。 堆中的具体内容由程序员安排。

2个

管理不同

Stack:系统自动分配空间,系统自动释放空间。 比如在函数中声明一个局部变量int b; 系统自动在栈中为b创建空间,栈空间在对应的生命周期结束时自动释放。

Heap:需要程序员手动申请和释放,并指定大小,C语言申请malloc函数,release free函数,C++实现new和delete。

3个

不同尺寸

堆栈:获得更少的空间。 Windows下,一般大小为1M或2M。 当剩余栈空间不足时,分配失败溢出。

Heap:获取的空间与系统的有效虚拟内存有关c语言堆和栈的区别,比较灵活c语言堆和栈的区别,较大。

4个

片段可以不同地产生吗

栈:无碎片,空间连续。

堆:采用链表的存储方式,会产生碎片。

5个

不同的成长方向

栈:向低地址扩展的数据结构,是一块连续的内存区域。

堆:向高地址扩展的数据结构,是一个不连续的内存区域。 这是因为系统使用链表来存储空闲内存地址,这些地址自然是不连续的,而链表的遍历方向是从低地址到高地址。

6个

分配不同

Stack:有2种分配方式:静态分配和动态分配。 static是由编译器完成的,比如局部变量; dynamic由alloca函数实现,编译器会释放。

堆:都是动态分配的,没有静态分配的堆。

7

分配效率不同

Stack:由系统自动分配,速度更快。 但是程序员失控了。

堆:new分配的内存一般比较慢,容易产生内存碎片,但是使用方便。

以上就是栈和堆几个方面的区别。 希望以上信息可以帮助初学者区分堆和栈。

扫码入群

扫码添加管理员微信

加入《电子产品大世界》粉丝交流群