我想大家都知道值类型和引用类型的区别,但我想到一个问题,如下声明一个Person类:
public class Person
{
string strName="";
int age=0;
.
.
.
.
.
.
}
现在我申明一个Person对象person,person当然是引用类型,存放于托管堆中,但person对象也有个int类型的age,age应该存储于托管堆栈才对是吧?那存储age的托管堆栈和存储person的托管堆是怎样联系起来的呢?多谢各位大虾赐教,最后祝各位大虾新年快乐,虎年行大运!
public class Person
{
string strName="";
int age=0;
.
.
.
.
.
.
}
现在我申明一个Person对象person,person当然是引用类型,存放于托管堆中,但person对象也有个int类型的age,age应该存储于托管堆栈才对是吧?那存储age的托管堆栈和存储person的托管堆是怎样联系起来的呢?多谢各位大虾赐教,最后祝各位大虾新年快乐,虎年行大运!
解决方案 »
- 兄弟们给看看,奇怪的问题。阿非哥孟子哥求出现
- C# 怎么在DataGridView控件里单击右键删除信息?
- 新手问一个关于IP地址和ARP缓存表的问题
- 各位高手快来.高分求Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient) 实现断点续传的新讨论,附源码
- windowapplication中怎样改变启动窗口?
- 菜鸟问题,高手过来帮帮忙
- 求验证textBox录入有效性的实现方法
- 将datagrid的内容导出到excel时 拒绝访问,请问如何解决
- (急)关于Convert.ChangeType()的使用
- 请问在哪能下载到OLEDB provider for Foxpro?
- 求购以.net为开发平台的B/S架构视频会议软件
- 请教正则表达式?
因为age在person里,所以在托管堆里。每当你运行一个托管程序,都会初始化一个托管堆,这个程序需要放在托管堆里的东西都放在这同一个堆里。
不能理解
我的问题中age并不是引用类型,仅仅是person对象是引用类型,准确的说我是想知道age在内存中与person对象在内存中的关系
您的意思是在person存储的托管堆中再开辟一个托管堆栈保存age?
你可以分别打出Age和StrName的内存地址看看就知道了,它们是靠在一起的,都随Person这个整体分配在堆上只有你的数据类型是值类型的时候,才会分配到栈上,这也就是又微又软不建议设计较大的结构的原因,如果结构较大,建议设计成类要以Person这个类的整体眼光来观察,不要看里面具体的字段,所谓子随母走,就这个道理
您的意思也是在person存储的托管堆中再开辟一个托管堆栈保存age?
有点明白,但还是没完全理解到...
那此处的age可以确定是保存在person所在的堆中了,但age是在堆中分配堆栈保存的还是直接保存在托管堆的非托管堆栈中?还是没说明白这个问题... ...
你能看到的仅仅是“值类型可以分配在栈上”
所以引用类型Person里面的int age分配在堆上有什么不妥吗?
typedef struct _Test{
int x;
int y;
char* cs;
}Test;int main()
{
Test t;
t.x = 22;
t.y = 55;
t.cs = "wabbee"; Test* p;
p = &t;
int* m = (int*)p;//结构名代表该结构的首地址,即C++中的类名就是类的首地址,所以能这样转
printf("x:%d\n",*m);//输出 22
printf("x's address:0x%x\n\n", m);//t.x的地址:0X240FF18
m++;
printf("y:%d\n", *m);//输出 55
printf("x's address:0x%x\n\n", m);//t.y的地址:0X240FF1C
m++;
char* s = (char*)(*m);
printf("s:%s\n", s);//输出 "wabbee"
printf("x's address:0x%x\n\n", m);//t.cs的地址: 0X240FF20
return 0;
}
注意三个指针的值(代表结构的三个变量)是紧紧靠在一起的,每个指针占用4个字节:
0X240FF18 //整数X的内存地址
0X240FF1C = 0X240FF18 + 4//整数Y的内存地址
0X240FF20 = 0X240FF1C + 4//指向字符串cs的指针的地址以上表明,一个自定义的数据类型,在内存中分配的内存是一个连续的块