问个c#值类型引用类型内存分配问题

zjj1211 2010-07-20 11:17:09
最近在学数据类型,关值类型和引用类型我是这样认为的,大家看看有没有什么问题 !
比如这样一个程序:
void Main (string[]ss)
{
int a=10;
char b='b';
int[] arr=new int[5];
}
像值类型 a b 在线程栈中 就分别分配一个 4个字节(32位)的内存地址给a , 然后分配一个字节的栈内存给 b。

像引用类型的arr 在托管堆中, 分配一个5*4个字节的堆内存给arr, 然后再栈中存储这个5*4个字节的堆内存的引用 也就是地址

不知道我上面说的2句话对不对? 如果都是对的,像int这样的值类型,栈给了他4个字节来保存,那引用类型的地址在栈中是用多大的空间来保存的呢?保存的是不是十六进制表示的内存地址?
...全文
299 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
brookmill 2010-07-21
  • 打赏
  • 举报
回复
sizeof(char *)的结果是4,所以指针是4字节的,换句话说地址是4字节的。
既然引用也是一种地址,那应该也是4字节吧,不过我不知道怎么验证。
zjj1211 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 brookmill 的回复:]
unsafe
{
Console.WriteLine(sizeof(int));
Console.WriteLine(sizeof(char));
Console.WriteLine(sizeof(byte));
}
输出 4 2 1
原来char是两个字节的。
引用类型的空间,用sizeof好像不行。用惯了c/c++感觉c#在这种地方很不方便,不过从另一个方面……
[/Quote]
哦 谢谢你哦 还是知道具体是多少比较有底气呀
oheasycg 2010-07-21
  • 打赏
  • 举报
回复
int[] arr=new int[5];
应该是5*4的空间放在堆中,arr保存数组首地址。arr的数据存储是在栈中,数组对象是在堆中
我以前做的一张教学ppt
ctwei86 2010-07-21
  • 打赏
  • 举报
回复
呵呵,楼主学的挺透彻呀!
顶!
zkyEric 2010-07-21
  • 打赏
  • 举报
回复
嘿嘿!帮顶!
请叫我卷福 2010-07-21
  • 打赏
  • 举报
回复
指针变量所占内存大小 根据不同机器 有所不同。。。

int[] arr=new int[5];
arr在栈上
如果int占4 byte,那么 堆上还有 4*5 byte ,arr的等于 4*5 这块内存的首地址编号
PS:以上套用C中的理解。。。C#中不太关注变量内存占用情况。。。不知对否 呵呵
jbo126 2010-07-21
  • 打赏
  • 举报
回复
我觉得都对,C#中应该有个引用计数,当为0时就会释放堆上的空间!
32位机器上为4字节,64位机器上为8字节!

我不是很有把握,后面的老师们别和我较真儿!谢谢!
zjj1211 2010-07-21
  • 打赏
  • 举报
回复
再顶顶 12点结贴
ILOVE_ASPNET 2010-07-21
  • 打赏
  • 举报
回复
这个问题看似简单明了,但是直正懂的话,说明对底层机制,掌握很透彻,支持。。
lanfengsese 2010-07-21
  • 打赏
  • 举报
回复
学习~
Peter200694013 2010-07-21
  • 打赏
  • 举报
回复
int[] arr=new int[5];
//在堆中申请数组空间,在栈中申请引用变量arr的空间
huminghua 2010-07-21
  • 打赏
  • 举报
回复
嘿嘿!帮顶!
zjj1211 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 brookmill 的回复:]

sizeof(char *)的结果是4,所以指针是4字节的,换句话说地址是4字节的。
既然引用也是一种地址,那应该也是4字节吧,不过我不知道怎么验证。
[/Quote]有道理有道理
brookmill 2010-07-20
  • 打赏
  • 举报
回复
查了一下,char是16位的unicode字符,所以是2字节
brookmill 2010-07-20
  • 打赏
  • 举报
回复
unsafe
{
Console.WriteLine(sizeof(int));
Console.WriteLine(sizeof(char));
Console.WriteLine(sizeof(byte));
}
输出 4 2 1
原来char是两个字节的。
引用类型的空间,用sizeof好像不行。用惯了c/c++感觉c#在这种地方很不方便,不过从另一个方面来说就是C#不必关心这种问题。
兔子-顾问 2010-07-20
  • 打赏
  • 举报
回复
int[] arr=new int[5];
这里有2个。
arr 是一个对象的引用
new int[5] 是长度为5*4的数组
数组应该是在堆上,arr不知道,不确定。按理说引用类型都是放在堆上,当没有使用的时候,被垃圾回收。
brookmill 2010-07-20
  • 打赏
  • 举报
回复
楼主说的那两句话,我觉得是对的。

引用类型的地址在栈中是用多大的空间来保存的呢?
应该是4个字节吧。不过用C#好像不用关心这个问题。

110,537

社区成员

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

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

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