【答疑释惑】C语言里面栈和堆的区别

很多初学者朋友对C语言里面的堆和栈理解的不是太清楚,模模糊糊。他们到底有哪些区别呢?我认为主要从以下几根方面来了解他们的不同之处:

1,变量位置:栈和堆都是程序在被加载器加载到内存后留出的一段空间,他们所在的地址不同,也不可能重叠。

2,增长方向:栈从高地址向低地址增长,也就是说栈空间使用越多,地址越小。堆空间从低地址向高地址增加,所以在不考虑中间有其他地址释放的情况下,后分配的对空间地址会比前面分配的大。

3,分配方式:栈空间通过栈指针移动自动实现,我们在写程序时并不关心这个问题。堆空间一般通过malloc/free或者new/delete来实现,这个过程需要我们显性管理。

4,存活时间:栈空间里面的变量存活时间取决于函数栈帧,当函数调用完返回,控制栈帧的ESP指针会自动恢复函数调用前的状态,达到栈平衡,栈帧自然消失,该栈中变量单元也处于不受管理状态,但在没有被其他函数作为栈使用之前,一般不会改变,所以有时候函数内的变量在外面还能正确访问到,但是已经不可靠。堆空间的存活时间存在于malloc/new和free/delete之间,但如果一直不free/delete,则会一直存在知道进程结束。

5,使用效率:堆空间由于只需要栈指针移动,在汇编层面上只要一条指令即可,速度快的多。而堆内存的分配需要经过复杂的查询、异步保护,时间相对慢很多。

6,泄露情况:栈空间由编译器控制,不会发生内存泄露(否则就出现栈平衡问题)。而堆分配由程序员显性控制,人脑不是电脑,总有可能会出现不配对的情况,因此可能出现泄露。

7,使用方式:一般在一个函数内部使用,退出函数就不再使用,占用空间不大的变量,适合栈变量,如果占用空间太大,可能会发生栈溢出的情况。而空间访问不只是局限于特定函数,且大小事先不好确定,或者函数内部使用大块内存的往往用malloc/new从堆上分配比较好。

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-08-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏算法与数据结构

利用代码计算原码,反码和补码

最近复习到数字逻辑的时候,看到的这一章节,想去上网找个计算器转换下,结果没有...

692
来自专栏Java爬坑系列

Java强引用、软引用、弱引用及虚引用深入探讨

引用类型在日常开发中并不常关注,也很少注意到,因此很多人忽略了它们的存在,而事实上,引用类型在Java体系中扮演着十分重要的角色,要想对Java体系有一个更深层...

632
来自专栏CDA数据分析师

Python中eval带来的潜在风险,你知道吗?

00 前言 eval是Python用于执行python表达式的一个内置函数,使用eval,可以很方便的将字符串动态执行。比如下列代码: >>> eval("1+...

3728
来自专栏互联网开发者交流社区

我个人对OOP的理解

773
来自专栏Java学习网

Java中提高代码复用性的方法及规范总结

一个好的程序员一定是用最少的代码实现最多的功能,代码复用是程序员所追求和期望的,这也是Java语言所提倡的;根据以往开发经验整理了一些能够提高代码复用性方法和规...

2877
来自专栏高性能服务器开发

经典面试题(三)之栈详解

我们常常说堆栈堆栈,但是堆和栈其实是完全不同的两个概念。栈其实完全是为了函数调用而设计的,那么函数调用如何通过栈实现的呢?不用函数调用方式,栈在行为上有什么区别...

3143
来自专栏IMWeb前端团队

Node中没搞明白require和import,你会被坑的很惨

ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是Common...

2398
来自专栏Phoenix的Android之旅

这是你在苦苦找寻的资料吗

趁着Java10发布的时候,小编将整理的有用的学习资料分享给大家,希望能有帮助。 下面说说刚发布的Java10.

632
来自专栏微信终端开发团队的专栏

C# 内存管理机制及 WP 内存泄漏定位方法

C#内存管理机制及WP内存泄漏定位方法 一、C#的内存管理机制 1. 托管资源与非托管资源 什么是托管资源?托管资源通俗的理解就是,把资源交给.net去管理,这...

2897
来自专栏从零开始学 Web 前端

嵌入式面试题(一)

4. 空指针(null pointer)指向了内存的什么地方(空指针的内部实现)?

702

扫码关注云+社区