搜索
bottom↓
回复: 152

请高手分别讲讲堆、栈、堆栈这三样东西,不明白他们的区别是什么。最好解释得通俗易懂

  [复制链接]

出0入0汤圆

发表于 2008-1-7 22:54:55 | 显示全部楼层 |阅读模式
菜鸟提问,如题

出0入0汤圆

发表于 2008-1-7 23:00:59 | 显示全部楼层
这三个 , 我认为是一个意思 。

出0入0汤圆

发表于 2008-1-7 23:10:33 | 显示全部楼层
我也认为是一样的,应该是一个意思吧

出0入0汤圆

发表于 2008-1-7 23:40:13 | 显示全部楼层
以下是从网上摘录的
---------------------------------------------------------------
堆”和“栈”是独立的概念平常说的“堆栈”实际上是两个概念:“堆”和“栈”。在英文中,堆是heap,栈是stack,不知道什么时候,什么原因,在中文里,这两个不同的概念硬是被搞在一起了,所以,围绕这个混合词所发生的误解和争执这几年就没有断过。

“栈”一般是由硬件(CPU)实现的,CPU用栈来保存调用子程序(函数)时的返回地址,高级语言有时也用它作为局部变量的存储空间。

“堆”是个实实在在的软件概念,使用与否完全由编程者“显示地(explicitly)”决定,如malloc。

程序经过编译连接生成执行程序后,堆和栈的起始地址就已经确定了(具体说,是通过“连接程序”),在一个具有反向增长的栈的CPU上,数据空间可表示如下:

低    ->|-----------------|
      | 全局量(所有已初始化量 .data, |
      | 未初始化量 .bss )       |
  堆起始->|-----------------|
      |    堆向高地址增长      |
      |                 |
      |                 |
      |     自由空间        |
      |                 |
      |                 |
      |    栈向低地址增长      |
高 栈起始->|-----------------|

在内存中,“堆”和“栈”共用全部的自由空间,只不过各自的起始地址和增长方向不同,它们之间并没有一个固定的界限,如果在运行时,“堆”和“栈”增长到发生了相互覆盖时,称为“栈堆冲突”,系统肯定垮台。由于开销方面的原因,各种编译在实现中都没有考虑解决这个问题,只有靠设计者自己解决,比如增加内存等。

=================================================================
说明(128为例)硬堆栈:
即SP,通常汇编中讲的所谓堆栈(用于PC指针等压栈),一般设置从片内RAM的顶部0X10FF开始向下生长,基本上64个足够足够了
软件堆栈:
C编译器自动分配的堆栈,在硬堆栈和全局变量之间的空间,也是向下生长,一般用于局部变量。比如一个子程序定义一个局部变量A[256],那么此空间即在软堆栈中,假设当前软堆栈用到0X800,分派A[256]后,软堆栈用到0X700,A[0]地址为0X700,A[1]地址为0X701 ……,当然如果局部变量较少,用寄存器就可以了,用不着软堆栈了。此子程序退出后软堆栈恢复到0X800。
另:你的C程序编译后,生成的汇编文件中,R28:R29就是软堆栈指针

一般硬堆栈只要在编译选项中设置,软堆栈编译器会自动设置。你只要看看*.mp文件是否合理就可以了。

出0入0汤圆

发表于 2008-1-8 00:02:08 | 显示全部楼层
正如【3楼】 marker所述
如果大家研究过arm的启动代码等类似的东西就清楚了。

出0入0汤圆

发表于 2008-1-8 08:11:02 | 显示全部楼层
没有研究过

出0入0汤圆

发表于 2008-1-8 10:38:25 | 显示全部楼层
堆栈是和队列相对的一个概念,二者的区别在于堆栈是先进后出(FILO)的,而队列先进先出(FIFO)
举例说明,如果安排A、B、C三个元素按次序压入(push)堆栈,再全部弹出(pop),顺序变为C,B,A;如果A、B、C顺次进入队列再出队列,顺序仍为A、B、C
堆和栈的区别如3楼所说,堆是硬件实现的,栈是一种数据结构,但是很多情况已经不区分它们了

出0入0汤圆

发表于 2008-1-8 12:01:52 | 显示全部楼层
任何一本数据结构

出0入0汤圆

发表于 2008-1-8 13:21:30 | 显示全部楼层
3楼的说法是正确的,7楼的说法有误导成分

出0入0汤圆

发表于 2008-1-8 16:11:12 | 显示全部楼层
生活中有一此事情必须是"后进先出"的,比如:两间很小的房间A,B,  A内有三只箱子,B为空房间,现在要求你要看一下A房最里的房子有什么东西.

现在你问题是:A已满了,你进不去,但你可以将箱子暂存于B房.

于是你会这样做

将A房最外的箱子,放至B房最内
将A房中间的箱子,放至B房中间
检查A房最内箱子的内容
将B房中间的箱子,放至A房中间
将B房最内的箱子,放至A房最外
完成

B就有了后进先出的意思

在计算机中中断嵌套调用,就需用到这个概念实现.

出0入0汤圆

发表于 2008-1-8 16:13:20 | 显示全部楼层
堆是堆,栈是栈,

一般情况所说的堆栈,实际上是栈。

出0入0汤圆

发表于 2008-1-8 16:48:00 | 显示全部楼层
堆是硬件实现的,栈是一种数据结构,但是很多情况已经不区分它们了
------------------------------------------------------------
三句话都刚好说反了。

  栈是由cpu实现的一种数据结构,其特点是后进先出。用于程序局部变量、程序返回地址。调用子程序、声明局部变量时,实际上就是在告诉编译程序使用“栈”这种数据结构。程序链接(link.exe)时,必须告诉链接程序为进程保留多大的栈空间。进程被加载时,操作系统就为该进程分配或者说保留这么大的内存空间作为栈来使用。
  代码空间、栈空间、全局变量空间都是保留的,没有这些空间进程会加载失败。这个时候操作系统会提示系统内存太少无法加载进程。
  堆空间相对代码空间、栈空间、全局变量空间,它是没娘的孩子。因为系统除去这些保留的空间,剩下的都是自由空间,它的头上插了根草标,表示这些空间没有使用,谁都可以自由的使用。
  堆空间唯一有用的时候,就是你的程序在执行malloc、realloc、new等操作时,堆空间就像站街女等待你的挑选。不过,操作系统的眼光好一点,它会通过malloc等函数帮你选好合适的站街女,选好的站街女就是这几个函数的返回值。
  站街女用完了之后,就用free、delete等操作撵走。

-  再通俗一点来说,栈是已经预先保留的内存空间,必须按照后进先出的方法使用。
-  而堆是,进程加载之后,系统多余的空间。

  如果程序加载时,操作系统提示内存不够导致加载失败,则必须去电脑城买一条更大的内存。
  如果程序运行过程中,提示栈溢出,则必须告诉程序员,重新链接程序。链接程序时指定大一点的栈空间。
  如果程序运行过程中,提示内存不够,这意味着堆空间不够。也必须去电脑城买一条更大的内存。
  如果不想买内存,或许可以这样:关闭一些已经运行的程序。比如防火墙、杀毒软件等,游戏、realplay、winamp就别关了。电脑不娱乐,还有什么用呀^_^。


补充一点:之所以要告诉链接程序需要保留多大的栈空间,是因为,无论是编译程序还是链接程序,都不知道程序运行需要多少栈空间,其实连程序员自己也不知道,只不过是根据经验指定。不过实际写程序时,好像大家并没有做这个操作,是因为开发平台有一个默认值已经设置好了。
而代码空间和全局变量空间不一样,程序编译好了就知道需要多大的代码空间和全局变量空间。所以链接程序可以自己决定。

出0入0汤圆

发表于 2008-1-8 16:50:06 | 显示全部楼层
堆栈是堆和栈的统称,但是好像很多时候只代表栈。几乎没有用堆栈来指堆的。

出0入296汤圆

发表于 2008-1-8 19:27:28 | 显示全部楼层
这里我提供一个图解软件(硬件)堆栈的例子,希望对大家有帮助。

//这是一段演示用的伪代码,包含了一些函数并设置了一些断点便于观察
//函数的细节已经省略,只保留了对其他函数的调用关系

//函数A
void FuncA(void)
{
    //没有任何针对其他函数的嵌套调用
       /*断点A1*/
}

//函数B
void FuncB(void)
{
    ……
    FuncA();                        //调用了函数A
    /*断点B1*/
           ……
}

//函数C
void FuncC (void)
{
    ……
    FuncB();                        //调用了函数B
    /*断点C1*/
    FuncA();                        //调用了函数C
    /*断点C2*/
    ……
}

//主函数
void main(void)
{
    ……
    /*在这里,我们设置一个程序断点,称为断点1*/
    FuncA();                       
    /*断点2*/
    FuncB();                       
    /*断点3*/
    FuncC();
    /*断点4*/
    ……
}

出0入296汤圆

发表于 2008-1-8 19:30:58 | 显示全部楼层
断点1和断点2之间的软件栈图示


断点2和断点3之间的软件栈图示



断点3和断点4之间的软件栈图示

出0入0汤圆

发表于 2008-1-8 20:47:39 | 显示全部楼层
谢谢!【15楼】 Gorgon Meducer 傻孩子
这个就非常清楚了。

另外说栈是硬件结构是错的,有的cpu是没有这个结构的(编译器去模拟)。

出0入0汤圆

发表于 2008-1-8 20:52:43 | 显示全部楼层
大多CPU应该都有硬件堆栈,即SP。不过在操作系统之上加载进程就以软件栈。就是软件模拟的栈了。

出0入296汤圆

发表于 2008-1-8 21:20:26 | 显示全部楼层
硬件堆栈仍然是通过软件来实现,并不是所谓的硬件实现。
硬件堆栈是相对软件堆栈来说的,它主要保存的是返回地址,而所谓的软件堆栈中保存的是栈帧信息。

出0入0汤圆

 楼主| 发表于 2008-1-8 21:35:29 | 显示全部楼层
非常感谢楼上各位大侠少侠花时间跟贴回答,特别是【3楼】 marker、【12楼】 jimo和【14楼】 Gorgon Meducer 傻孩子。虽然我还没有完全弄明白,但已经有了一定认识:
1)平时所说的“堆栈”是指“栈”。在没有RAM的AVR芯片中“栈”是硬件栈,有RAM的芯片中“栈”不是硬件栈。不知道这样理解对不对?
2)按12楼的解释:“堆”是执行malloc、realloc、new等操作时获得的RAM空间,执行free、delete等操作后堆空间释放为自由RAM。

出0入0汤圆

发表于 2008-1-8 22:03:20 | 显示全部楼层
15楼解释的很直白了,记点东西

出0入0汤圆

发表于 2008-1-8 22:45:18 | 显示全部楼层
可不可以这样理解,堆栈是一种特殊的底部不动,顶部可以伸缩的内存空间,在这个内存空间里,每次数据只存在他的顶部,又只从他的顶部取走。

出0入0汤圆

发表于 2008-1-9 00:31:51 | 显示全部楼层
就是酱紫的~

出0入0汤圆

发表于 2008-1-9 01:21:50 | 显示全部楼层
好奇妙的讲解,我不太明白是不是有人至今还不知道有google这么个东西?

出0入0汤圆

发表于 2008-1-9 23:30:24 | 显示全部楼层
在没有RAM的AVR芯片中“栈”是硬件栈,有RAM的芯片中“栈”不是硬件栈
-----------------------------------------------------
基本上所有的cpu都有call, ret, push,pop等操作,这些就是对栈进行操作。栈是一片ram,不管ram是cpu内部带的,还是象x86那样在主板上另外插的。所谓的“硬件栈”,就是指cpu用push, pop等操作的对象空间。
如果程序是通过jmp来调用子程序和从子程序返回,执行 sp = sp + n 来获得局部变量的空间,则为上面说的软件栈。不过,估计现在很难找到软件栈。这样的cpu你愿意用吗?速度慢而且代码复杂。


“堆”是执行malloc、realloc、new等操作时获得的RAM空间,执行free、delete等操作后堆空间释放为自由RAM
--------------------------------------------------------------------------------
不是的。堆是自由空间,malloc等是对堆进行操作,得到的空间为保留空间。free操作把保留空间释放到堆中。
不过,不是从堆中分配来的内存,是不能进行free操作的。


多用汇编写写程序,大概会比较容易明白堆和栈之间的区别。

出0入0汤圆

发表于 2008-1-9 23:46:38 | 显示全部楼层
我也来个图说明一下吧:


大的圆圈是系统总共的内存。
进程刚刚加载到内存中,你写的if...else...for...while等占用的是代码这个圆圈。
在函数里声明的局部变量、类对象等,占用的是栈这个圆圈。因为程序没有运行,所以不知道要占用多大,所以会给一个大一点的空间。call的返回地址,push等就是对这块区域进行操作。至于什么是后进先出,到教科书上看看就知道了。
代码之外的全局变量、各地声明的静态变量(类的静态成员、函数里声明的静态局部变量)占用的是全局变量这个圆圈。
三个小圆圈在进程加载时的大小是已知的。大圆圈建区三个小圆圈的剩余部分,就是堆空间。

随着程序的运行,你可能想根据不同的情况要多一点的空间,比如3个mm或者5个mm,这几个mm在进程加载时是不知道的,因此只能在堆空间里通过malloc霸占。



这样,红色圆圈里的空间变成保留空间,只能由你使用。除非你把这3个mm free掉。

出0入0汤圆

发表于 2008-1-10 00:10:02 | 显示全部楼层
大多CPU应该都有硬件堆栈,即SP。更正一下:SP不是堆栈,而是堆栈指针,即Stack Pointer。堆栈说白了就是一个储存空间,先进后出的。

出0入0汤圆

发表于 2008-1-10 00:27:52 | 显示全部楼层
Windows API 中有HeapAlloc、VirtualAlloc、GlobalAlloc、LocalAlloc等函数而没有类似StackAlloc的函数。从这也大概可以知道堆根栈的分别。

出0入0汤圆

 楼主| 发表于 2008-1-10 00:44:14 | 显示全部楼层
谢谢几位的讲解!

出0入0汤圆

发表于 2008-1-10 00:46:05 | 显示全部楼层
to 【24楼】 jimo
    "不过,估计现在很难找到软件栈。这样的cpu你愿意用吗?速度慢而且代码复杂。"
    哈哈,mips的架构可没有哦,我们公司全用这个。

出0入0汤圆

发表于 2008-1-10 06:14:49 | 显示全部楼层
比较喜欢【12楼】 jimo 的讲解方法。。。

出0入0汤圆

发表于 2009-1-15 13:07:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-1-15 14:33:33 | 显示全部楼层
谢谢~~

出0入0汤圆

发表于 2009-1-15 23:35:56 | 显示全部楼层
呵呵 堆就是用完不要的东西,呵呵,站街女,太形象了。

出675入8汤圆

发表于 2009-6-14 20:13:31 | 显示全部楼层
mark,好好理解下高手们的建议

出0入0汤圆

发表于 2009-6-14 22:23:20 | 显示全部楼层
不懂,慢慢学习

出0入0汤圆

发表于 2009-6-14 23:49:50 | 显示全部楼层
实际上如果用汇编的话,就很容易理解了。没学汇编之前,至少我自己根本就没法理解

出0入0汤圆

发表于 2009-6-15 01:23:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-15 08:36:16 | 显示全部楼层
armok

出0入0汤圆

发表于 2009-6-15 09:03:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-15 09:41:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-15 10:07:10 | 显示全部楼层
顺便再请教下:
如果中断来了,CPU会将当前的上下文压入堆栈,此时,是由CPU自动将所有的寄存器压入 栈 中吧?这些都是由硬件自动完成的吧?

前面14楼,15楼所示的,是由硬件完成的?还是软件完成的?

出0入0汤圆

发表于 2009-6-15 11:09:39 | 显示全部楼层
以前总以为 颈椎病 是一种病
自从听了某人的一段相声后才发现 原来是不同的概念  只不过我们都把它们连起来叫罢了

颈,又称脖子,到菜市场,说买鸡颈,人家不懂,说买鸡脖子,谁都明白;椎,又叫腔骨,到菜市场,说买猪椎,人家不懂,说买猪腔骨,就都明白了。所以颈是颈,椎是椎,颈颈椎椎,椎椎颈颈……

我所看过的所有单片机的书全只称为 堆栈  包括马老师的 用翻译软件也是 把stack 翻译成 堆栈了 今天算是长见识了

出0入0汤圆

发表于 2009-6-15 11:16:53 | 显示全部楼层
学习了

出0入0汤圆

发表于 2009-6-15 14:47:17 | 显示全部楼层
m

出0入0汤圆

发表于 2009-6-15 15:07:59 | 显示全部楼层
“堆栈”一般指“栈”(stack),是后进先出的数据结构,一般也只支持从栈顶用push和pop指令寻址。典型地用于中断时保存现场和返回地址、函数调用时保存寄存器现场和返回地址、传递函数参数和保存子函数的局部变量。“堆栈”的叫法似乎只出现在讲解硬件(如微机原理和单片机)的国内书籍内,实际指“栈”,讲软件和数据结构的书籍,一般都叫栈,很少叫堆栈。(汉语“堆栈”应该是算偏正短语吧,重点还是在栈字上,个人看法)

“堆”(heap)是内存中连续开辟的一段内存空间,典型地用于动态分配和释放内存(如c语言中的malloc()和free()函数),一般可以随机寻址。

出0入4汤圆

发表于 2009-6-15 15:15:55 | 显示全部楼层
学习。

出0入0汤圆

发表于 2009-6-16 00:17:46 | 显示全部楼层
Mark

出0入0汤圆

发表于 2009-6-16 03:50:23 | 显示全部楼层
有深度。。。。看不懂……不过收藏了

出0入0汤圆

发表于 2009-6-16 07:45:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-16 22:26:13 | 显示全部楼层
堆空间相对代码空间、栈空间、全局变量空间,它是没娘的孩子。因为系统除去这些保留的空间,剩下的都是自由空间,它的头上插了根草标,表示这些空间没有使用,谁都可以自由的使用。
  堆空间唯一有用的时候,就是你的程序在执行malloc、realloc、new等操作时,堆空间就像站街女等待你的挑选。不过,操作系统的眼光好一点,它会通过malloc等函数帮你选好合适的站街女,选好的站街女就是这几个函数的返回值。
  站街女用完了之后,就用free、delete等操作撵走

出0入0汤圆

发表于 2009-6-17 08:30:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-9 11:18:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-9 12:57:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-9 13:20:19 | 显示全部楼层
记号,貌似讲的不错~~

出0入0汤圆

发表于 2009-8-9 13:30:41 | 显示全部楼层
纠缠不已,很多时候还专门考这个概念呢,中文表达有时确实头痛

出0入0汤圆

发表于 2009-8-10 00:02:09 | 显示全部楼层
请教一下,IAR  的general选项里的heap size指的是什么呢?

出0入0汤圆

发表于 2010-2-27 01:12:31 | 显示全部楼层
留名学习

出0入0汤圆

发表于 2010-2-27 01:45:54 | 显示全部楼层
哦,记号~

出0入0汤圆

发表于 2010-2-27 02:03:22 | 显示全部楼层
make

出0入0汤圆

发表于 2010-3-1 09:51:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-1 11:02:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-1 11:34:59 | 显示全部楼层
堆 软件
栈 硬件(或硬件加软件设置)
堆栈 属于栈

出0入0汤圆

发表于 2010-3-1 14:27:14 | 显示全部楼层
12楼讲的有趣 ^^

出0入0汤圆

发表于 2010-3-2 01:11:23 | 显示全部楼层
一直想搞懂的东东,学习了

出0入0汤圆

发表于 2010-7-27 21:15:33 | 显示全部楼层
好好学习

出0入0汤圆

发表于 2010-7-27 23:47:39 | 显示全部楼层
mark

出0入9汤圆

发表于 2010-7-28 10:11:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-28 10:40:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-28 18:26:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-28 23:18:12 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2010-7-29 02:20:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-29 06:59:18 | 显示全部楼层
mark

出0入4汤圆

发表于 2010-7-29 07:20:33 | 显示全部楼层
简单点讲,堆就像一个水池,你可以自由的在里面取水,再放回(malloc,free)。栈就像一个水井,只能从顶部取水或放回(PUSH,POP),但它们同属于一个水系(RAM,少量单片机是硬件栈)。

出0入0汤圆

发表于 2010-7-29 09:41:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-7 22:01:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-20 15:22:44 | 显示全部楼层
怎么都没一个权威点的说法啊

出50入0汤圆

发表于 2011-8-20 15:45:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-20 18:06:49 | 显示全部楼层
堆 栈

出0入0汤圆

发表于 2011-8-21 07:21:38 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-8-21 12:48:54 | 显示全部楼层
学习了

出0入0汤圆

发表于 2011-8-21 13:01:02 | 显示全部楼层
15楼形象,好!

出0入0汤圆

发表于 2011-8-21 13:14:30 | 显示全部楼层
好啊!学习了!

出0入0汤圆

发表于 2011-8-21 13:35:06 | 显示全部楼层
不错的讨论

出0入0汤圆

发表于 2011-8-21 15:53:03 | 显示全部楼层
堆是堆,栈是栈,堆栈就是把堆和栈合起来说!

出0入0汤圆

发表于 2011-8-22 07:30:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-22 08:18:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-22 08:18:54 | 显示全部楼层
没看懂。

出0入0汤圆

发表于 2011-8-22 08:30:24 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-8-22 08:53:03 | 显示全部楼层
看不懂,但想学习;MARK一个。

出0入0汤圆

 楼主| 发表于 2011-8-22 09:00:04 | 显示全部楼层
哈哈,几年前的贴子了!虽然现在还是菜鸟一个,但是已经弄明白了堆跟栈是不一样的东西。衷心感谢回复帖子的各位老师,你们的回复让我受益匪浅。

出0入0汤圆

发表于 2011-8-22 11:54:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-22 14:55:45 | 显示全部楼层
mark 回来看

出0入0汤圆

发表于 2011-9-6 20:21:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-6 23:42:46 | 显示全部楼层
malloc();  free();  就是从"堆"里动态分配和释放内存的
PUSH, POP,          就是进/出"栈"的CPU指令

这样是否好理解点...

出0入0汤圆

发表于 2011-9-7 00:10:35 | 显示全部楼层
学习了  以前真没发现有啥区别

出15入9汤圆

发表于 2011-9-7 00:29:03 | 显示全部楼层
谢谢几位的讲解!

出0入0汤圆

发表于 2011-9-7 04:05:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-7 04:23:57 | 显示全部楼层
回复【42楼】zhwm3064 沉伦蜗牛
以前总以为 颈椎病 是一种病  
自从听了某人的一段相声后才发现 原来是不同的概念  只不过我们都把它们连起来叫罢了
颈,又称脖子,到菜市场,说买鸡颈,人家不懂,说买鸡脖子,谁都明白;椎,又叫腔骨,到菜市场,说买猪椎,人家不懂,说买猪腔骨,就都明白了。所以颈是颈,椎是椎,颈颈椎椎,椎椎颈颈……
我所看过的所有单片机的书全只称为 堆栈  包括马老师的 用翻译软件也是 把stack 翻译成 堆栈了 今天算是长见识了
-----------------------------------------------------------------------

颈椎与堆栈不可类比。因为有颈椎 脊椎 腰椎之说。所以颈椎是指脖子部位的腔骨。

堆栈似乎应是堆和栈的总称,但实际是指栈。特别是单片机中,由于资源限制和安全起见,很少使用malloc和free操作。也就是堆在单片机中处于被摒弃的状态。

出0入0汤圆

发表于 2011-9-7 07:29:48 | 显示全部楼层
虽然这帖子已经很老了,不过我一直想说:

分不清堆和栈的人,如果你们是计算机专业毕业的,你们有必要从大一开始重新学一次

专业技术论坛什么时候成混文凭者的补习教室了?都这个样子,也难怪现在大学应届毕业生总是找不到工作……

出0入0汤圆

 楼主| 发表于 2011-9-7 08:09:49 | 显示全部楼层
楼上高人见笑了!我不是科班出身,单片机是业余玩玩,C语言也是业余时间看书自学的,很多计算机方面概念性的东西当时真的是不大清楚的。当然后来,C语言到一定程度后这个就不是问题啦
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-9 00:49

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

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