【答疑释惑】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 条评论
登录 后参与评论

相关文章

来自专栏猿人谷

对缓存的思考——提高命中率

开篇 编写高效的程序并不只在于算法的精巧,还应该考虑到计算机内部的组织结构,cpu微指令的执行,缓存的组织和工作原理等。 好的算法在实际中不见得有高效率,如果完...

1939
来自专栏CodingToDie

java 反射

反射 前言 当我们使用框架带给我们的开发上的便利的时候,其内部的运行机制应该是什么样的呢? 例如:在ORM框架中,如何将 bean与 数据库表进行关联, 字段 ...

2263
来自专栏逢魔安全实验室

UAF Writeup - pwnable.kr

0x00 UAF — pwnable.kr是一个韩国的CTF练习的网站,有很多经典的CTF题目供爱好者练习。 UAF(Use After Free)释放后重用...

3326
来自专栏Jimoer

jvm学习记录-对象的创建、对象的内存布局、对象的访问定位

简述 今天继续写《深入理解java虚拟机》的对象创建的理解。这次和上次隔的时间有些长,是因为有些东西确实不好理解,就查阅各种资料,然后弄明白了才来做记录。 (此...

2597
来自专栏Golang语言社区

Go语言并发编程总结

Golang :不要通过共享内存来通信,而应该通过通信来共享内存。这句风靡在Go社区的话,说的就是 goroutine中的 channel ....... 他在...

2897
来自专栏芋道源码1024

【死磕Java并发】—– Java内存模型之重排序

在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 在单线程环境下不能改...

3487
来自专栏西枫里博客

以关联表中的count计数作为主表的排序依据(进阶版)

上一篇文章在最后提到“在foreach循环中嵌套查询,这是非常耗费资源的”。当时考虑到本站应用场景简单,查询仅为百位数量级,性能损失忽略不计,就图简单没有深入去...

672
来自专栏非著名程序员

10个经典的Java面试题集合

概述:还在做无准备的面试吗?还在为找不到Java的面试题而苦恼吗?那么你就一定不能错过以下小编为你量身打造的Java面试题集合了!让我们一起来看看 这里有10个...

1905
来自专栏IT可乐

Java 反射详解

  反射反射,程序员的快乐! 一、什么是反射?   通过百度百科我们可以知道,Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;...

1707
来自专栏听Allen瞎扯淡

一起 Static 和 Synchronized 引发的血案

这两天在定位一个网上问题的时候发现一个很诡异的现象,系统夜间的汇总任务跑了很长一段时间才能结束,而且日志显示这些汇总任务的每个子任务都很快就结束了,但整体任务还...

862

扫描关注云+社区