A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵刘滨 中级黑马   /  2012-8-4 18:40  /  1843 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

堆和栈的区别是什么?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

6 个回复

倒序浏览
区别我也不太明白,但是全局变量定义之后是在绽中存放,new一个对象是在堆中存放;

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
你可以把栈区想想成书本的目录,把堆区想象成书本的内容

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
他们二者的本质区别在于堆相等于值类型,栈相等于引用类型。前者的值会发生改变,而后者的值不会发生改变。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
这是一个前辈写的,非常详细

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"优化成一个地方。
}  

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
栈是程序编译时就分配好的内存大小,所以你的程序中必须明确栈的内存大小,而堆是在程序运行动态分配的内存空间,它是根据程序员需要动态分配内存的、

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
堆通常是一个可以被看做一棵树的数组对象
堆总是满足下列性质:
1) 堆中某个节点的值总是大于或小于其父节点的值;
2) 堆总是一颗完全树
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。

栈也可称堆栈按照后进先出的原理运作



评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马