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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沈可 中级黑马   /  2014-1-14 15:50  /  963 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 沈可 于 2014-1-14 20:08 编辑

堆和栈是怎么分配内存空间的?

评分

参与人数 1技术分 +1 收起 理由
卖火柴 + 1

查看全部评分

4 个回复

倒序浏览
堆中的内存一般是使用new来分配的。
而栈内存,主函数执行的地方就在栈内存当中。

评分

参与人数 1技术分 +1 收起 理由
卖火柴 + 1

查看全部评分

回复 使用道具 举报
堆和栈是是内存的两块组成,栈中存放的是运行时的一些值类型的变量的值以及一些引用类型的引用地址,他们所占的大小基本上是已知的固定的,是通过压栈和出栈来创建和销毁的。

堆内存中存放的是引用类型的变量的具体值,也就是new出来的东西他们的实际值,它们占用的内存大小是未知的,但他们在堆内存中存放值的地址块的编号因为是固定大小的,于是把它放在了栈内存中的,

访问堆内存中的变量的值时,先从栈内存中找到它在堆内存中对应的地址编号,然后再去堆内存中操作数据

评分

参与人数 1技术分 +1 收起 理由
卖火柴 + 1

查看全部评分

回复 使用道具 举报
当我们看到一个变量类型是已知的,就分配在栈里面面,比如INT,Double等。
其他未知的类型,比如自定义的类型,因为系统不知道需要多大,所以程序自己申请,这样就分配在堆里面。
值类型是分配在栈里面,引用类型分配在堆里面。
从内存的分配角度来看,是因为值类型,已经知道了类型的范围大小,可以进行有效分配,比如int,计算机是知道其范围的,所以直接由系统分配在栈中,无需自己申请!
而新的类型,比如自己定义一个类,很明显这个类是不知道大小的,应该有程序自己来申请内存空间,所以由堆来分配!

评分

参与人数 1技术分 +1 收起 理由
卖火柴 + 1

查看全部评分

回复 使用道具 举报
栈:由系统自动分配,如变量的声明的同时会开辟空间,(int a; 开辟4个字节的空间)(静态指定)
堆:由程序员申请,需要制定大小(动态分配)

评分

参与人数 1技术分 +1 收起 理由
卖火柴 + 1

查看全部评分

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