首页 新闻 会员 周边

求问大神 在C#中 如果在Main()方法定义 一个int[]类型数组长度为0 在内存的栈堆是如何开辟空间?

0
悬赏园豆:15 [待解决问题]

int[] arr=new int[0]

即定义一个数组长度为0的数组 

在栈空间会开辟一块 int[] 类型空间 用来存储堆空间对象地址 (数组长度为0 一直没搞懂到底是啥分配空间的?)  而在堆空间中 因为要创建对象(创建对象的第一步 即在堆空间开辟一块合适大小的空间) 没搞清楚到底有没分配空间?

还有顺便问一下C#中的引用类型 和 C++中的指针有啥区别没?

Lumia1020的主页 Lumia1020 | 初学一级 | 园豆:189
提问于:2014-04-07 20:28
< >
分享
所有回答(1)
0

堆中 分配了,只是 空间大小的问题

Qlin | 园豆:2403 (老鸟四级) | 2014-04-08 09:15

我认为应该是分配了 不过 数组长度为0 里面没有存任何元素  我想问一下到底分配了什么类型大小的空间

像int[] arr=new int[3] 在堆空间分配了三块连续的int类型空间(应该可以这样理解) 就是想问一下数组长度为0的话 具体是如何的 

支持(1) 反对(0) Lumia1020 | 园豆:189 (初学一级) | 2014-04-09 02:10

@Lumia1020: 

除了 里面元素大小空间的分配,还有其他的分配,如数组类型 TypeHandler、基类及祖先object中的等成员进行分配,再根据数组大小分配,如 int[3],再分配3个子元素,如果是int[0],就不分配了。

支持(0) 反对(0) Qlin | 园豆:2403 (老鸟四级) | 2014-04-09 10:39

@Qlin: 除了 里面元素大小空间的分配,还有其他的分配,如数组类型 TypeHandler、基类及祖先object中的等成员进行分配,再根据数组大小分配,如 int[3],再分配3个子元素

这句话有点不明白  在创建对象的时候  第一步不是在堆空间开辟一块合适大小的空间  第二步才是创建对象吗(创建对象的时候  会根据自身类中的成员以及继承自父类的成员  一般类都会继承object   再在空间中创建对象 ) 像int[] arr=new int[3]( 首先是在栈空间中开辟一块int[]类型空间 即变量arr 用来之后存储堆空间中对象地址  )

 而new int[3]的时候 会在堆空间中开辟三块int类型大小空间(或许可以这样理解) 第二步根据int类中的相关成员创建对象(包括继承自父类object valueType类的相关成员 int本身为结构体 本质也是一个类吧)  

如果是int[] arr=new int[0]  按照以上理解 好象有没开空间 请问大神 以上理解有何误区?

支持(0) 反对(0) Lumia1020 | 园豆:189 (初学一级) | 2014-04-09 15:19

@Lumia1020: 你的理解没错,当int[0]时,还有其它的成员会占空间,不只是这个子元素

支持(0) 反对(0) Qlin | 园豆:2403 (老鸟四级) | 2014-04-09 16:20

@Qlin: 嗯 你讲的我了解 我就是还有一个地方有点不明白  new 一个对象的时候   有四个步骤 1 开辟合适大小的空间 2 依照类的模板创建对象  3 调用构造方法  4 返回堆空间的地址

 

就是第一个步骤的时候 开辟合适大小的空间 (什么叫做合适大小?) 第二个步骤是依照类的模板创建对象成员 

 

像以上讲的 new int[3]    那么 在第二个步骤的时候  会创建int类型自身中的所有成员以及object ValueType中的所有继承过来的成员(父类继承过来的成员是在第二个步骤创建的) 如果是new int[3] 那么在第一步是开辟一块空间(类似三个int类型空间之和) new int[0] (0个int类型空间 那么相当于没有开辟空间? 我就是这个地方有点不理解

 

还有第三步 创建对象 要调用构造方法  而在调用构造函数之前 看反编译工具 在第二步的时候(第二步即创建对象)  应该是已经创建好继承父类过来的成员 

 

而创建对象中的第一步就已经确定好空间(这个不知道有没有错误?) 我就不知道第一步 到底开辟多少空间 才为合适大小空间 

 

不知有没有表达清楚 你再看看 麻烦了

 

 还有顺便我想问一个问题 像string类型 接口类型 如果在Main方法中定义如下

string a="123"

IFly b=new Bird()  IFly为自定义的一个接口

由于a b变量最终都仅仅是存储一个地址 地址指向堆空间对象地址 那么在栈空间中开辟的空间大小

即string类型变量a  IFly接口类型变量b  空间是不是一样大小?(由于都是引用类型 仅仅只存储一个地址 地址指向堆空间创建的对象)

支持(0) 反对(0) Lumia1020 | 园豆:189 (初学一级) | 2014-04-09 19:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册