黑马程序员技术交流社区

标题: c#中定义一个int类型变量的值存放在哪里? [打印本页]

作者: 邵帅    时间: 2012-12-10 22:24
标题: c#中定义一个int类型变量的值存放在哪里?
比如说我定义一个变量 int number=2那么这个2存放在System.Int32结构的什么地方呢?我查了查msdn。里面都是说的接口这些,没有说到储存的,不是太明白这个int number=2中的2存放在哪里了?

作者: 汪磊    时间: 2012-12-10 23:25
int number=2就相当于在内存中某个地方开了块儿地叫number,把这个2放进去!
回头研究研究苏坤老师的"开房间"问题就明白啦!
作者: 王彦伟    时间: 2012-12-11 09:53
相当于在内存中某个地方开了块儿地叫number,把这个2放进去,不过是按二进制放进去的
作者: 李行周    时间: 2012-12-11 10:23
在内存里面,int类型的数据是32位的,也就是四个字节,由内存中的四个连续基本单元存放你的int数据。汇编言语的声明方式(int):num1 DD 3 相当于int num=3;  num2 DD ? 相当于int num2;(DD表示双字32数据类型,Dw表于字,DB表示字节)在内存中存放形式可以是以H结尾的十六进制,也可是以D结尾的十进制,也可是以Q结尾的八进制,可以是以B结尾的二进制
作者: rla540    时间: 2012-12-12 00:14
1:如果这个int变量是在main或其它方法中定义的,那么他存储在栈空间中,栈就是内存中一块用来存储数据的连续空间,通过esp和ebp两个寄存器来控制范围。每个函数都有一个对应的栈空间,进入main时,main就会分得一块栈空间,里边保存着函数返回地址,函数参数,局部变量等。当main函数又调用了其它函数时,就会对刚才的栈空间进行保存。然后在紧挨着原栈空间的上方(比原来地址低的地址处)重新划分一块空间存放新调用的方法所需要的数据,同样也是由esp和ebp两个寄存器来控制的。更多细节需要有一定的汇编知识才能解决!形象地来说,一叠盘子罗在一起(每个盘子就是main需要的数据),当main又调用其它方法时,在这罗盘子上又依次罗上了若干个盘子。当退出这个方法时,上边的盘子就会被拿掉(后进先出)这也是为什么在一个方法中定义的变量可以和其它方法中的变量同名,一个方法中的变量一旦出了方法的作用域就不能再调用的原因。这也是使用栈空间存储数据所所据有的灵活性!

2:如果这个int类型是在类中定义的,那么这个int变量就会被分配到堆空间中。堆是内存中很大的一块空间,也是用于存放数据的。他存活的时间由引用决定。如果有一个引用指向了堆空间。也就是有对象被使用。那么他就会一直存活着,如果这个引用被重新赋值指向了其它对象,若引用被赋值为null那么c#中的垃圾回收机制就会启动,来释放这个堆空间。而在C++中释放堆空间完全是由程序员所决定的,如果程序员一旦忘记释放堆空间,就有可能出现内存用完的情况,最终导致崩溃!也就是所谓的内存泄漏。这种情况下程序结束后,操作系统也会回收这些空间。

3:其它情况。像静态变量,全局变量又会存放在另外一些空间中(如全局数据区)。不同的需要存放不同的空间。各有优点,也各有缺点
作者: 黑马丁巍    时间: 2012-12-12 10:46
存放在内存中
作者: 985127948    时间: 2012-12-13 03:35
类似于在内存中有一个number的地方,将2放进去。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2