C#实例化内存分配问题

classA{inta=12}classB{staticvoidMain(string[]args){AC1=newA();AC2=newA();Console.Writ... class A
{
int a = 12
}
class B
{
static void Main(string[] args)
{
A C1 = new A();
A C2 = new A();
Console.WriteLine("C1.a");
C2.a=6
Console.WriteLine("C2.a");
}

}
结果输出的是 12 6 吗?我的问题是当A被实例化两次,a变量是在内存中如何分配的??都分配在堆栈中吗??
展开
 我来答
果建翼
2011-11-06 · TA获得超过7923个赞
知道大有可为答主
回答量:1684
采纳率:0%
帮助的人:2429万
展开全部
首先,堆和栈是两码事。堆(heap)主要用于动态内存分配,而栈(stack)主要是用于函数内自动变量的空间分配。

在C#中,任何引用类型的变量,都是在堆上分配的。(强制声明stackalloc等特殊情况除外)
各种class就是引用类型,所以都是在堆上分配的。

你那个例子,有两个变量,一个是C1,一个是C2,它们各自有一个成员a,彼此互不影响。
二者都分配在堆上,位置不同。所以你C1中a的值是12,C2中a的值是6,二者之间没有影响。
追问
先谢谢你,还有一点疑问。书上说 值类型变量存储在栈中。int a 不是值类型吗?
追答
你是什么书?“值类型变量存储在栈中” 这句话不完全正确。只有在函数内部直接定义的值类型,比如你在函数内部定义了一个int a,它才是在stack上面分配的。而对象内部的成员变量(除非静态),不管是值还是引用类型,它都只是整个对象的一部分,而整个对象是在堆上分配的。

感觉你在学C#之前,略微学下C语言会很有助于你对这种概念的理解。这其实是动态内存分配方面的问题,你要是会用C里面的malloc和free,那C#这里面的这些概念的理解都不成问题了。
h1398123
2011-11-06 · TA获得超过216个赞
知道小有建树答主
回答量:173
采纳率:0%
帮助的人:70.8万
展开全部
楼主是新手吧(话说我也是新手来着,从来都没入过门),堆栈的概念都不一样的,怎么会分配堆栈中。
我说说看,不对的话,咱们再讨论:
首先A第一次实例化(也就是C1),那么系统会为它分配一段内存,用来储存数据;(其实你可以在这用指针标记下地址,int* C11=&C1.a)
然后A第二次实例化(也就是C2),那么系统又会为它分配一段内存,用来储存数据;;(其实你依然可以在这用指针标记下地址,int* C22=&C2.a)
然后你调用了,C1.a,也就是说你调用了内存地址为C11的数据,即c1.a的数据存放在C11地址的内存中,你调用了数据,然后输出到屏幕;
然后你为C2.a赋值,即你将内存地址C22的数据从12更改为6;
最后,你调用C2.a输出。
a变量,在两次实例化时,就给各自为其分配了一段内存空间(注解:如果不实例化,那么系统是不会为你分配内存的)。
若有错漏,万望指正。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
将米有深法0l
2011-11-07
知道答主
回答量:52
采纳率:0%
帮助的人:7.1万
展开全部
打印出来结果是:
C1.a
C2.a

╮(╯▽╰)╭怎么会是12 和 6 呢?求教!O(∩_∩)O哈哈~

言归正传吧,不逗你了!
当你每次使用new A()实例化一个对象时,都是调用A类的构造函数在堆中开辟了一个新地址(注意:每次使用都会开辟)。而这个地址中就有一个int变量,这个int变量的值初始化是12,当你对这个int变量的值做修改时,是不会开辟新的地址的!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式