信元苍穹 发表于 2013-1-31 11:56:37

信元苍穹 发表于 2013-1-31 11:57:13

信元苍穹 发表于 2013-1-31 11:58:57

lcofjp 发表于 2013-1-31 12:12:44

栈是存储临时变量的地方,先进后出,FILO。
堆是动态分配空间的区域,使用malloc和free申请释放。
FIFO,队列,先进先出。
C的功能除了汇编没有比它更灵活的了,你还想要啥功能?

tim 发表于 2013-1-31 12:13:45

堆是堆,栈是栈,堆栈在实际往往也是栈

NJ8888 发表于 2013-1-31 12:16:44

堆是你主动申请用的(局部变量),栈是代码自动申请用的(函数调用保护现场)

Wxy8030 发表于 2013-1-31 12:19:48

NJ8888 发表于 2013-1-31 12:16 static/image/common/back.gif
堆是你主动申请用的(局部变量),栈是代码自动申请用的(函数调用保护现场)

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

Wxy8030 发表于 2013-1-31 12:21:54

TMD一激动说反了!

本帖最后由 Wxy8030 于 2013-1-31 12:59 编辑

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

信元苍穹 发表于 2013-1-31 12:24:50

i_kkyu 发表于 2013-1-31 12:26:28

有本C++的书里介绍的比较深入。

lcofjp 发表于 2013-1-31 12:43:36

Wxy8030 发表于 2013-1-31 12:21 static/image/common/back.gif
对于keil for ARM:一直知道“堆”是用于局部变量,KEIL编译后也会告诉你大概是多少,惟独“栈”一直不知道 ...

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

myqiang1990 发表于 2013-1-31 12:47:31

FIFO何时成了C语言的一部分了?

Wxy8030 发表于 2013-1-31 13:00:00

lcofjp 发表于 2013-1-31 12:43 static/image/common/back.gif
真抱歉你的理解一直是错误的,堆只是用在动态申请上的,局部变量存放在栈中,栈用来存放在函数调用或者中 ...

一激动说反了!

Wxy8030 发表于 2013-1-31 13:04:09

lcofjp 发表于 2013-1-31 12:43 static/image/common/back.gif
真抱歉你的理解一直是错误的,堆只是用在动态申请上的,局部变量存放在栈中,栈用来存放在函数调用或者中 ...

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

lcofjp 发表于 2013-1-31 13:20:39

Wxy8030 发表于 2013-1-31 13:04 static/image/common/back.gif
我对你的“动态申请”不太理解 —— 我没用C语言跑过操作系统,只用过 keil for ARM 裸奔过51和ARM,所以 ...

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

Wxy8030 发表于 2013-1-31 13:23:57

lcofjp 发表于 2013-1-31 13:20 static/image/common/back.gif
我在上面不是已经说过了吗,通过malloc进行动态申请,free释放,这两个函数相信你是学过的,别说你没学过 ...

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

dzmcs 发表于 2013-1-31 13:24:50

heap-堆是被管理的不定长度数据的一个区域,不安顺序分配,一般会用malloc等分配,free去释放
stack-是一个顺序分配的定长数据区域,一般也指auto变量或者返回值寄存的内存区域
fifo应该也可以叫做stack

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

lovecrystal 发表于 2013-1-31 13:31:44

一个是吃完了就拉 一个是吃完了就吐

chenhua1991 发表于 2013-1-31 13:39:37

lovecrystal 发表于 2013-1-31 13:31一个是吃完了就拉 一个是吃完了就吐

精辟!!

lcofjp 发表于 2013-1-31 13:45:12

Wxy8030 发表于 2013-1-31 13:23 static/image/common/back.gif
请教两个问题:
1、什么 malloc、new之类 的函数,我只是听说,但从来没用过,也从来没干过“动态申请” ...

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

elevator 发表于 2013-1-31 13:52:51

栈条就是农村里使用的一种农具。用于栈存谷物。晒谷物或轧米时,用围成圈的栈条临时存储谷、麦、米等,待装入袋子或米囤后拆除
,先进的粮食后出,后装进的粮食当然先出了

QQ373466062 发表于 2013-1-31 14:14:20


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

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

william_rain 发表于 2013-1-31 14:32:00

迷茫啊!,,,,,,,,

Wxy8030 发表于 2013-1-31 14:41:51

lcofjp 发表于 2013-1-31 13:45 static/image/common/back.gif
动态分配是指在程序运行的时候确定占用内存空间的大小,例如用户可能要输入一组数,让你求平均数,他可能 ...

{:handshake:} {:victory:} {:loveliness:}

解惑啊!

Wxy8030 发表于 2013-1-31 14:42:38

象我这种从汇编玩过来的人,真不习惯那种高级的编程思维 ...... 所以至今裸奔!

笑笑我笑了 发表于 2013-1-31 14:50:37

好像栈和堆的生长方向是反的

Alvin007 发表于 2013-1-31 14:59:54

正在看《程序员的自我修养—链接、装载与库》
强烈推荐

Taylor1 发表于 2013-1-31 22:46:01

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

qwe2231695 发表于 2013-2-1 00:14:43

【上网摘抄一段】
二、malloc()到底从哪里得来了内存空间:

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

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

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

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

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

stely 发表于 2013-2-1 08:55:49

我也一直没理解得很透彻,来听各位大师解惑。

Wxy8030 发表于 2013-2-1 09:16:59

Taylor1 发表于 2013-1-31 22:46 static/image/common/back.gif
堆更多的与OS相关,而栈即使是裸奔也是一定要用的,响应中断就有入栈会发生.
如果自己管理内存,就可以看成是 ...

透彻!

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

hamipeter 发表于 2013-2-1 10:11:24

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



谢谢介绍的两本好书

jz701209李 发表于 2013-2-1 15:44:58

路过,学习一下

Wxy8030 发表于 2013-2-1 16:15:40

楼主犯啥事情了?
页: [1]
查看完整版本: C语言中;堆与栈的情结如何解?