搜索
bottom↓
回复: 33

C语言中;堆与栈的情结如何解?

[复制链接]
头像被屏蔽

出0入0汤圆

发表于 2013-1-31 11:56:37 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2013-1-31 11:57:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2013-1-31 11:58:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2013-1-31 12:12:44 | 显示全部楼层
栈是存储临时变量的地方,先进后出,FILO。
堆是动态分配空间的区域,使用malloc和free申请释放。
FIFO,队列,先进先出。
C的功能除了汇编没有比它更灵活的了,你还想要啥功能?

出0入93汤圆

发表于 2013-1-31 12:13:45 | 显示全部楼层
堆是堆,栈是栈,堆栈在实际往往也是栈

出0入0汤圆

发表于 2013-1-31 12:16:44 | 显示全部楼层
堆是你主动申请用的(局部变量),栈是代码自动申请用的(函数调用保护现场)

出0入0汤圆

发表于 2013-1-31 12:19:48 | 显示全部楼层
NJ8888 发表于 2013-1-31 12:16
堆是你主动申请用的(局部变量),栈是代码自动申请用的(函数调用保护现场)

“栈”的说法不知道正确与否 —— 但这个是我目前看到的唯一说得不含糊的!

出0入0汤圆

发表于 2013-1-31 12:21:54 | 显示全部楼层
本帖最后由 Wxy8030 于 2013-1-31 12:59 编辑

对于keil for ARM:一直知道“栈(stack)”是用于局部变量,KEIL编译后也会告诉你大概是多少,惟独“堆”一直不知道是干什么用的 ......
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2013-1-31 12:24:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2013-1-31 12:26:28 | 显示全部楼层
有本C++的书里介绍的比较深入。

出0入0汤圆

发表于 2013-1-31 12:43:36 | 显示全部楼层
Wxy8030 发表于 2013-1-31 12:21
对于keil for ARM:一直知道“堆”是用于局部变量,KEIL编译后也会告诉你大概是多少,惟独“栈”一直不知道 ...

真抱歉你的理解一直是错误的,堆只是用在动态申请上的,局部变量存放在栈中,栈用来存放在函数调用或者中断时的寄存器内容以及分配局部变量。

出0入0汤圆

发表于 2013-1-31 12:47:31 | 显示全部楼层
FIFO何时成了C语言的一部分了?

出0入0汤圆

发表于 2013-1-31 13:00:00 | 显示全部楼层
lcofjp 发表于 2013-1-31 12:43
真抱歉你的理解一直是错误的,堆只是用在动态申请上的,局部变量存放在栈中,栈用来存放在函数调用或者中 ...

一激动说反了!

出0入0汤圆

发表于 2013-1-31 13:04:09 | 显示全部楼层
lcofjp 发表于 2013-1-31 12:43
真抱歉你的理解一直是错误的,堆只是用在动态申请上的,局部变量存放在栈中,栈用来存放在函数调用或者中 ...

我对你的“动态申请”不太理解 —— 我没用C语言跑过操作系统,只用过 keil for ARM 裸奔过51和ARM,所以到现在也没干过“动态申请”这种事情,对我来说,变量就两种,一是函数里的临时变量,这些变量的地址退出函数后就给其他函数用了(一直以为中断时保护现场的变量也在这里);一是全局变量,至始至终都占用固定的地址;

出0入0汤圆

发表于 2013-1-31 13:20:39 | 显示全部楼层
Wxy8030 发表于 2013-1-31 13:04
我对你的“动态申请”不太理解 —— 我没用C语言跑过操作系统,只用过 keil for ARM 裸奔过51和ARM,所以 ...

我在上面不是已经说过了吗,通过malloc进行动态申请,free释放,这两个函数相信你是学过的,别说你没学过C语言。

出0入0汤圆

发表于 2013-1-31 13:23:57 | 显示全部楼层
lcofjp 发表于 2013-1-31 13:20
我在上面不是已经说过了吗,通过malloc进行动态申请,free释放,这两个函数相信你是学过的,别说你没学过 ...

请教两个问题:
1、什么 malloc、new之类 的函数,我只是听说,但从来没用过,也从来没干过“动态申请”这种事情;
2、如果我不“动态申请”,KEIL 会不会自己干?比如它自己什么时候 new 个RAM区用?如果它也不会,那么基于这两点,我是否可以把 HEAP 区设为 0 ?

出0入0汤圆

发表于 2013-1-31 13:24:50 | 显示全部楼层
heap-堆是被管理的不定长度数据的一个区域,不安顺序分配,一般会用malloc等分配,free去释放
stack-是一个顺序分配的定长数据区域,一般也指auto变量或者返回值寄存的内存区域
fifo应该也可以叫做stack

常说的堆栈一般就是指暂存auto变量和返回值的栈区

出0入0汤圆

发表于 2013-1-31 13:31:44 | 显示全部楼层
一个是吃完了就拉 一个是吃完了就吐

出0入0汤圆

发表于 2013-1-31 13:39:37 来自手机 | 显示全部楼层
lovecrystal 发表于 2013-1-31 13:31  一个是吃完了就拉 一个是吃完了就吐

精辟!!

出0入0汤圆

发表于 2013-1-31 13:45:12 | 显示全部楼层
Wxy8030 发表于 2013-1-31 13:23
请教两个问题:
1、什么 malloc、new之类 的函数,我只是听说,但从来没用过,也从来没干过“动态申请” ...

动态分配是指在程序运行的时候确定占用内存空间的大小,例如用户可能要输入一组数,让你求平均数,他可能输入100个,也可能输入1000个数,他输入的个数不确定,所以不能使用固定数组去存储(当然使用一个非常大的数组是可以,但是如果用户输入的个数总是那么几个,就会造成空间的浪费)。这个时候就可以使用malloc来分配指定个数的存储区域用来存放数据,在你用完之后可以用free归还给系统。动态分配的空间都是在堆中,由C运行时维护这片区域。
如果你不使用堆,在现代的智能开发环境下,是不会存在堆的,你设不设置heap的size关系不大。

出0入0汤圆

发表于 2013-1-31 13:52:51 | 显示全部楼层
栈条就是农村里使用的一种农具。用于栈存谷物。晒谷物或轧米时,用围成圈的栈条临时存储谷、麦、米等,待装入袋子或米囤后拆除
,先进的粮食后出,后装进的粮食当然先出了

出0入0汤圆

发表于 2013-1-31 14:14:20 | 显示全部楼层

可以看 《专业嵌入式软件开发》 这本书  
如果有些基础,继续看《程序员的自我修养—链接、装载与库》

看完前面第一本的堆栈部分应该就大部分理解。 对应章节可以下载的

出0入0汤圆

发表于 2013-1-31 14:32:00 | 显示全部楼层
迷茫啊!,,,,,,,,

出0入0汤圆

发表于 2013-1-31 14:41:51 | 显示全部楼层
lcofjp 发表于 2013-1-31 13:45
动态分配是指在程序运行的时候确定占用内存空间的大小,例如用户可能要输入一组数,让你求平均数,他可能 ...



解惑啊!

出0入0汤圆

发表于 2013-1-31 14:42:38 | 显示全部楼层
象我这种从汇编玩过来的人,真不习惯那种高级的编程思维 ...... 所以至今裸奔!

出0入0汤圆

发表于 2013-1-31 14:50:37 | 显示全部楼层
好像栈和堆的生长方向是反的

出0入0汤圆

发表于 2013-1-31 14:59:54 | 显示全部楼层
正在看《程序员的自我修养—链接、装载与库》
强烈推荐

出0入0汤圆

发表于 2013-1-31 22:46:01 | 显示全部楼层
堆更多的与OS相关,而栈即使是裸奔也是一定要用的,响应中断就有入栈会发生.
如果自己管理内存,就可以看成是堆被使用了.如果你没有写过动态申请RAM的代码,而所有的内存都由编译器管理,并且没有指针动态生成,那就没有用堆.
堆栈更偏向于用在数据结构中,指一种先进后出的算法,常常l用指针实现,支持它实现的OS机制是堆.

出105入79汤圆

发表于 2013-2-1 00:14:43 | 显示全部楼层
【上网摘抄一段】
二、malloc()到底从哪里得来了内存空间:

1、malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。就是这样!

   说到这里,不得不另外插入一个小话题,相信大家也知道是什么话题了。什么是堆?说到堆,又忍不住说到了栈!什么是栈?下面就另外开个小部分专门而又简单地说一下这个题外话:

2、什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。

   什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。

http://www.bccn.net/Article/kfyy/cyy/jszl/200608/4238.html

出0入0汤圆

发表于 2013-2-1 08:55:49 | 显示全部楼层
我也一直没理解得很透彻,来听各位大师解惑。

出0入0汤圆

发表于 2013-2-1 09:16:59 | 显示全部楼层
Taylor1 发表于 2013-1-31 22:46
堆更多的与OS相关,而栈即使是裸奔也是一定要用的,响应中断就有入栈会发生.
如果自己管理内存,就可以看成是 ...

透彻!

其实对我这种裸奔的来说,就要确认 堆 是不是可以直接设定为 0 !

出0入0汤圆

发表于 2013-2-1 10:11:24 来自手机 | 显示全部楼层
QQ373466062 发表于 2013-1-31 14:14
可以看 《专业嵌入式软件开发》 这本书  
如果有些基础,继续看《程序员的自我修养—链接、装载与库》


谢谢介绍的两本好书

出0入0汤圆

发表于 2013-2-1 15:44:58 来自手机 | 显示全部楼层
路过,学习一下

出0入0汤圆

发表于 2013-2-1 16:15:40 | 显示全部楼层
楼主犯啥事情了?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 07:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表