C# 数组内存分配问题

夜之子 2012-09-25 03:58:09
第一个问题:

int [] test = new test[100];

我知道在堆中分配了100个单元的内存空间,但是在栈中存储的是堆中的地址,问栈中分配了几个单元的内存空间来存地址呢?
我自己查了下栈中好像是只保存了堆中100个单元的首地址,不大确定,求解?还有就是如果栈中只分配了一个单元存储堆中首地址的话,那我们test[10]这样查数组中的某个元素怎么定位的,是到堆中遍历数组吗?

第二个问题:

A [] test = new A[100];

A是一个类,网上是这么说的:会先在托管堆为test分配一次空间,并且这时不会自动初始化任何元素(即test[i]均为null)。等到以后有代码初始化某个元素的时候(A[0]=new A();),这个引用类型元素的存储空间才会被分配在托管堆上。
我想问的是"先在托管堆为test分配一次空间",这句话是什么意思,它分配了100个单位的内存空间吗?但后面A[0] = new A();进行实例化时,它才分配了真正存储数据的单元,但开始分配的100个单元的空间有什么用呢?
...全文
492 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wthwinner2003 2015-05-19
  • 打赏
  • 举报
回复
首先,如果你声明的是值类型的数组,那么CLR分配内存时在堆中一次性分配足够的内存空间,每个单元应该是所存储类型的两倍左右的容量,也就是200份int 类型的内存。该数据是已值方式存储的。 如果是引用类型的话会创建100分的地址存储引用空间,只是在没初始化数组中具体值的时候都每个单元都存储的是null引用,这个引用是4个字节长,当你对数组中某项初始化的时候,系统再次动态在堆中分配内存,并在这个数组项中存储新分配内存的引用。
lukern 2014-06-26
  • 打赏
  • 举报
回复
应该是4个字节
玫_瑰骑_士 2013-04-07
  • 打赏
  • 举报
回复
和楼主同问~
夜之子 2012-09-25
  • 打赏
  • 举报
回复
继续求解
bdmh 2012-09-25
  • 打赏
  • 举报
回复
地址是Int型

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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