社区
C++ Builder
帖子详情
什么是堆、栈、堆栈?
wyh4030
2004-01-14 08:20:36
如上????
...全文
855
10
打赏
收藏
什么是堆、栈、堆栈?
如上????
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sleeper520
2004-01-23
打赏
举报
回复
哦,原来如此,
月亮兄
小弟佩服
矜持的射手
2004-01-23
打赏
举报
回复
比如abcdefg七个结点,跟接点为a 第二层为bc,第三层为de fg,依次排下去
就形成堆.
如果进行初始化(排序或结点调整),就形成大根堆或小根堆
win2000server
2004-01-15
打赏
举报
回复
听课
dfwid
2004-01-15
打赏
举报
回复
回复人: liuhuascanf(扫描仪) ( ) 信誉:100 2004-01-14 23:57:00 得分:0
堆是一棵完全二叉树,每个元素安顺序从根接点按层次排,直到最后一个排完。
------------------------------
不懂, 是否可以詳細解釋一下
?
George1227
2004-01-15
打赏
举报
回复
讲得好,真好,收藏!
tokens
2004-01-15
打赏
举报
回复
栈 - 由编译器自动分配释放,比如一个函数里有int i,当调用这个函数时,i被压栈,调用完后i出栈.
堆 - 由程序员自己管理分配释放,如new delete...
矜持的射手
2004-01-14
打赏
举报
回复
堆是一棵完全二叉树,每个元素安顺序从根接点按层次排,直到最后一个排完。
栈(或者说堆栈)好比一个死胡同,先进去的只能最后一个出来,洞口的第一个出来。
栈就是堆栈!
fansses
2004-01-14
打赏
举报
回复
引用一下
一般认为在c中分为这几个存储区
1栈 - 由编译器自动分配释放
2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束释放
4另外还有一个专门放常量的地方。 - 程序结束释放
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。
比如:
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc";栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
}
还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。
栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用你操心。
堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻符值的,而bbbbbbbbbbb是在编译时就确定的
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:
#include <stdio.h>
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。
一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap.
栈是先入后出的,一般是由高地址向低地址生长。
weixing979
2004-01-14
打赏
举报
回复
看看数据结构书啊,讲的很明白
esiedull
2004-01-14
打赏
举报
回复
堆就是heap
我基础也不好亚,,呵呵,等答案....
堆
栈
?
堆
?
栈
?
学计算机的过程中,我们经常听闻“
堆
”、“
栈
”、“
堆
栈
”这样的概念,那么什么是“
堆
”、什么是“
栈
”、什么又是“
堆
栈
”呢? 其实,
堆
栈
就是
栈
,他们都是一种先进后出的数据结构,
堆
栈
只是
栈
的另一种抽象名称而已。所以,从结构上来说,只有
栈
和
堆
两种类型。
栈
所谓
栈
,是一种先进后出(或者后进先出)的数据结构,它类似一个你刚刚买的一盒好丽友派。假设你只能从一侧打开,然后一个个取,只有当上面的取完了后才能从下面取;然而生产商在包装的时候,肯定是先放的在最下面,后放的在最上面。这样你吃到的第一个派其实是包装员最后一个放进去的
堆
栈
详解
一 首先介绍下
堆
和
堆
栈
(
堆
栈
)的是什么,区别是什么? 注意,其实
堆
栈
本身就是
栈
(stack)。通俗易懂说,
堆
栈
==
栈
,
堆
==
堆
(heap) 1.
堆
:什么是
堆
?又该怎么理解呢? 答:1,
堆
(heap)是一种数据结构,
堆
控制一段自己的存储空间,叫做
堆
空间。 2,
堆
是在程序运行时申请的动态内存,而不是在程序编译时,申请某个大小的内存空间。 3,
堆
是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。 2.
栈
(
堆
栈
):什么是
堆
栈
?又该怎么理解呢? ...
什么是
堆
栈
?
堆
栈
用来干什么的?
在程序运行当中,每一个线程都有自己的
栈
空间,
栈
是用来干什么用的呢?还记得我们C语言学习的时候函数的局部变量么?
栈
空间就是用来保存局部变量的。所以我们就回答了第一个问题,
栈
有什么用,
栈
就是用来保存函数的局部变量的。
什么是java中的
栈
和
堆
_java中的
堆
和
栈
是什么?
堆
和
栈
有什么区别?
java中的
堆
和
栈
是什么?
堆
和
栈
有什么区别?发布时间:2020-06-02 11:51:19来源:亿速云阅读:183作者:Leahjava中的
堆
和
栈
是什么?
堆
和
栈
有什么区别?这些问题可能是我们日常工作会见到的。通过这些问题,希望你能收获更多。下面是揭开这些问题的详细内容。首先我们来简单看一下
堆
和
栈
:1、
堆
和
栈
是两种数据结构,只能在一端对数据项进行插入和删除。2、在单片机应用中,
堆
栈
是个特殊的存储区...
计算机的
堆
、
栈
你知道吗?
堆
栈
呢?!
这一计算机术语的起源可以追溯到早期的计算机科学和程序设计领域,其命名和功能的设计模仿了现实世界中的一种物理
堆
叠方式——如同
堆
放在一起的盘子或书本。在计算机科学中,
堆
栈
是一种特殊的数据结构,它遵循“后进先出”(Last In, First Out,简称LIFO)的原则。这意味着最后被加入到
堆
栈
中的数据项会是第一个被移除的。这种数据结构的特性非常适合处理那些需要临时存储并且按顺序恢复的数据,比如在程序中处理函数调用时的局部变量和返回地址。
C++ Builder
13,871
社区成员
102,693
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章