请教高手一个困惑已久的问题

DDR2013 2013-12-19 09:33:47
到底什么是堆?什么是栈?什么是堆栈?有没有高手解答下呀?
...全文
345 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
pay_all_for 2016-03-26
  • 打赏
  • 举报
回复
@楼主 你说过csapp是垃圾的 可是你的问题看完csapp第三章就完全明白了 看来只有新手才会对一本书妄加评论 p.s. 这本书正在看第三遍 感觉每次看都收获不小
lm_whales 2013-12-19
  • 打赏
  • 举报
回复
1)堆栈 的本意是堆和栈,后来专指栈。 2)堆 是英文heap 的翻译,栈是stack的翻译。 3)stack 是结构化编程流行的时候,出现的程序结构, 用于安排局部变量,程序参数,还有函数过程的返回地址。 4)heap 是自由空间,C,C++等编程语言,用它来动态分配内存。 5)全局性质的数据,存放在数据区, 对于C语言,包括外部变量,各种静态变量,和一些常量(比如字符串),就是存放在静态区。 而现在的程序(操作系统,增加了数据执行保护功能) 常量,可能存放在常量区。 这些数据,既不在栈区,也不在堆区。 6)数据有3个空间,栈空间,堆空间,数据空间。 早期程序(早期的 BASIC,Fortran,等),可能只有数据,没有局部变量,也不去动态分配内存,所有的变量都是全局的。 所以到处都是跳转语句。
lm_whales 2013-12-19
  • 打赏
  • 举报
回复
不过程式编程语言 应该是 不过,过程式编程语言的出现,结构化编程的推广 过程式编程语言,例如 pascal,c,fortran 66,77, 其中 fortran 66,77, 里面跳转语句还很多,很多程序都还在跳来跳去。
shiguojie19892 2013-12-19
  • 打赏
  • 举报
回复
引用 2 楼 bjtbjt 的回复:
堆和栈的区别

一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,
初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量
在相邻的另一块区域。 - 程序结束后有系统释放 
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
very good!整解!
lm_whales 2013-12-19
  • 打赏
  • 举报
回复
这要从早期的程序布局,讲起 早期的程序(尤其是DOS)是,分不同模式的, 其中DOS tiny 一共64K空间; 这时,stack 放在64K尾部 heap 放在代码数据,后面。 DOS small 模式只有 64K代码,64K数据 这时,stack 放在代码的64K尾部 heap 放在代码后面 heap 向下生长,stack向上生长。 这两种情况下, heap ,stack 是一块连续的空间, 堆栈,就是 堆和栈。 heap 是堆,stack是栈 而中文双字词比单字词更响亮,更好记 所以stack翻译成堆栈。 heap只翻译成堆。 堆是一块未使用区域,称为自由空间。而C语言库函数,从堆空间,分配内存供程序员使用 这就是动态分配内存。 所以,动态分配的数据在堆空间。 PS: 堆栈就是 --stack --- heap 从汉语构词法上说, 堆栈是个偏义复词,就是一个栈字,堆字无意义。 其他操作系统的程序,估计早期也有类似的结构; 更早的程序,可能布局不同, 不过程式编程语言的出现,栈就开始流行了, 这时候程序结构,大致就是这个样子了。 后来的程序,布局应该形态各异了。 PS: heapstack, 对应的汉语 意义还是没有大的变化。 堆栈这个汉语词汇也就因循下来了。
大奶兔白糖 2013-12-19
  • 打赏
  • 举报
回复
引用 2 楼 bjtbjt 的回复:
堆和栈的区别

一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,
初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量
在相邻的另一块区域。 - 程序结束后有系统释放 
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
受教了,现在想想之前有次面试我被面试人员豁了。。。。当时问我堆和栈的区别,我说了一下,然后他突然问我堆的数据结构,我第一反应是内存管理和组织的数据结构,就说没研究过,然后他用恨铁不成钢的语气对我说,其实这个很简单,说出来你也应该知道,就是二叉树。我当时想这次没白来,就算没机会也学到了东西,现在看来Y偷换概念
赵4老师 2013-12-19
  • 打赏
  • 举报
回复
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
Isnis-fallen 2013-12-19
  • 打赏
  • 举报
回复
堆是用new申请利用的, 要自己释放否则会消耗内存

栈保存局部变量, 不用你自己释放

图灵狗 2013-12-19
  • 打赏
  • 举报
回复
参考http://blog.csdn.net/wxlkeepmoving/article/details/5633218
引用 楼主 DDR2013 的回复:
到底什么是堆?什么是栈?什么是堆栈?有没有高手解答下呀?
5t4rk 2013-12-19
  • 打赏
  • 举报
回复
堆和栈的区别

一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,
初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量
在相邻的另一块区域。 - 程序结束后有系统释放 
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
你怎么了熊吉 2013-12-19
  • 打赏
  • 举报
回复
堆栈就是栈 堆则是另一回事 在数据结构里,栈和堆是两种数据结构 在程序设计里,栈和堆是内存的两块不同区域,栈主要放局部变量,堆主要放动态分配的变量
mujiok2003 2013-12-19
  • 打赏
  • 举报
回复
堆(heap)栈(stack)是两个不同的机构。
邢政 2013-12-19
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
人才呀!
大奶兔白糖 2013-12-19
  • 打赏
  • 举报
回复
引用 12 楼 jiandingzhe 的回复:
[quote=引用 7 楼 bijiaoben 的回复:] [quote=引用 2 楼 bjtbjt 的回复:]
堆和栈的区别

一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,
初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量
在相邻的另一块区域。 - 程序结束后有系统释放 
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
受教了,现在想想之前有次面试我被面试人员豁了。。。。当时问我堆和栈的区别,我说了一下,然后他突然问我堆的数据结构,我第一反应是内存管理和组织的数据结构,就说没研究过,然后他用恨铁不成钢的语气对我说,其实这个很简单,说出来你也应该知道,就是二叉树。我当时想这次没白来,就算没机会也学到了东西,现在看来Y偷换概念[/quote] 那人是扯淡。谁规定必须用二叉树的?要是用多叉树呢?万一不用树呢? 实际上,有那种专门优化的内存分配器,光分配不释放的。[/quote] 我想当时他问的应该是数据结构里面的那个堆,而不是咱们这里说的分内存的这个堆
忘世麒麟 2013-12-19
  • 打赏
  • 举报
回复
stack有的书将他翻译成堆或者栈,甚至堆栈,这跟翻译者的水平有关; 同时heap也是如此。 假如希望不被疑惑,有两个方法: 第一个:直接看英文原著或者对照多本教材; 第二个:弄明白三大存储区一个各存储区分别有什么作用。这样碰到堆栈字眼时可以从功能上分别他们。
hui211314ddhui 2013-12-19
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊
jiandingzhe 2013-12-19
  • 打赏
  • 举报
回复
引用 7 楼 bijiaoben 的回复:
[quote=引用 2 楼 bjtbjt 的回复:]
堆和栈的区别

一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,
初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量
在相邻的另一块区域。 - 程序结束后有系统释放 
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
受教了,现在想想之前有次面试我被面试人员豁了。。。。当时问我堆和栈的区别,我说了一下,然后他突然问我堆的数据结构,我第一反应是内存管理和组织的数据结构,就说没研究过,然后他用恨铁不成钢的语气对我说,其实这个很简单,说出来你也应该知道,就是二叉树。我当时想这次没白来,就算没机会也学到了东西,现在看来Y偷换概念[/quote] 那人是扯淡。谁规定必须用二叉树的?要是用多叉树呢?万一不用树呢? 实际上,有那种专门优化的内存分配器,光分配不释放的。

64,653

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧