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变量是在内存中如何分配的??都分配在堆栈中吗?? 展开
{
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变量是在内存中如何分配的??都分配在堆栈中吗?? 展开
3个回答
展开全部
首先,堆和栈是两码事。堆(heap)主要用于动态内存分配,而栈(stack)主要是用于函数内自动变量的空间分配。
在C#中,任何引用类型的变量,都是在堆上分配的。(强制声明stackalloc等特殊情况除外)
各种class就是引用类型,所以都是在堆上分配的。
你那个例子,有两个变量,一个是C1,一个是C2,它们各自有一个成员a,彼此互不影响。
二者都分配在堆上,位置不同。所以你C1中a的值是12,C2中a的值是6,二者之间没有影响。
在C#中,任何引用类型的变量,都是在堆上分配的。(强制声明stackalloc等特殊情况除外)
各种class就是引用类型,所以都是在堆上分配的。
你那个例子,有两个变量,一个是C1,一个是C2,它们各自有一个成员a,彼此互不影响。
二者都分配在堆上,位置不同。所以你C1中a的值是12,C2中a的值是6,二者之间没有影响。
追问
先谢谢你,还有一点疑问。书上说 值类型变量存储在栈中。int a 不是值类型吗?
追答
你是什么书?“值类型变量存储在栈中” 这句话不完全正确。只有在函数内部直接定义的值类型,比如你在函数内部定义了一个int a,它才是在stack上面分配的。而对象内部的成员变量(除非静态),不管是值还是引用类型,它都只是整个对象的一部分,而整个对象是在堆上分配的。
感觉你在学C#之前,略微学下C语言会很有助于你对这种概念的理解。这其实是动态内存分配方面的问题,你要是会用C里面的malloc和free,那C#这里面的这些概念的理解都不成问题了。
展开全部
楼主是新手吧(话说我也是新手来着,从来都没入过门),堆栈的概念都不一样的,怎么会分配堆栈中。
我说说看,不对的话,咱们再讨论:
首先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变量,在两次实例化时,就给各自为其分配了一段内存空间(注解:如果不实例化,那么系统是不会为你分配内存的)。
若有错漏,万望指正。
我说说看,不对的话,咱们再讨论:
首先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变量,在两次实例化时,就给各自为其分配了一段内存空间(注解:如果不实例化,那么系统是不会为你分配内存的)。
若有错漏,万望指正。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
打印出来结果是:
C1.a
C2.a
╮(╯▽╰)╭怎么会是12 和 6 呢?求教!O(∩_∩)O哈哈~
言归正传吧,不逗你了!
当你每次使用new A()实例化一个对象时,都是调用A类的构造函数在堆中开辟了一个新地址(注意:每次使用都会开辟)。而这个地址中就有一个int变量,这个int变量的值初始化是12,当你对这个int变量的值做修改时,是不会开辟新的地址的!
C1.a
C2.a
╮(╯▽╰)╭怎么会是12 和 6 呢?求教!O(∩_∩)O哈哈~
言归正传吧,不逗你了!
当你每次使用new A()实例化一个对象时,都是调用A类的构造函数在堆中开辟了一个新地址(注意:每次使用都会开辟)。而这个地址中就有一个int变量,这个int变量的值初始化是12,当你对这个int变量的值做修改时,是不会开辟新的地址的!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询