C#高级编程(第四版)中第7章总关于堆栈的机制说
堆栈是由上向下填充的,即由高位地址向低位地址填充的。
例如
{
 int i = 10 ; 
 double d = 30.0
}
如果当前堆栈指针指向的堆栈保留的内存快末尾的地址为800000,则会将i放在存储单元799996 - 799999中,并且值为10.然后再将d放在 799988 -799995的存储单元上。但是我觉得实际上不是这样的的
例如
class test
{
   static void Main()
   {
     int number = 1;
     int number2 = 2;
     unsafe
     {
     System.Console.WriteLine("number address {0}", (long)&number);
     System.Console.WriteLine("number2 address {0}", (long)&number2);     }
}
}
实际上输出的结果是number2的地址大于number.也就是说实际上是由低位向高位填充的。
到底是C#高级编程(第四版)的说法有错误,还是我的理解有错位,相关的内容我在MSDN中没有找到明确的说明,所有只能向大家请教了!

解决方案 »

  1.   

    TO sunrobust(咸鱼):那么就是说C#高级编程(第四版)的说法有错误啦!
      

  2.   

    很奇怪
     class ClassConvert
        {
            unsafe static void Main()
            {
                int number = 1024;
                int number2 = 2;
                int number3 = 5;
                System.Console.WriteLine("number  address {0}", (long)&number);
                System.Console.WriteLine("number2 address {0}", (long)&number2);
                System.Console.WriteLine("number3 address {0}", (long)&number3);
            }
        }
    在我的机器结果为
    number  address 1242228
    number2  address 1242224
    number3  address 1242220是按照由高向低的方式入堆栈的,但是屏蔽了number3的代码结果就倒过来了。
    class ClassConvert
        {
            unsafe static void Main()
            {
                int number = 1024;
                int number2 = 2;           
                System.Console.WriteLine("number  address {0}", (long)&number);
                System.Console.WriteLine("number2 address {0}", (long)&number2);
                
            }
        }在我的机器结果为
    number  address 1242228
    number2  address 1242232按照由低向高的顺序入堆栈!!!
    这是怎么回事呀!
      

  3.   

    栈:在Windows下, 栈是向低地址扩展的数据结构,是一块连续的内存的区域。
      

  4.   

    根本的原因就是:
    int number1,number2根本不在堆,
    内建数据类型的局部变量(local)在栈中
    在.NET的内存模型下,只有托管的内存才放在托管堆里,有虚拟机负责分配和释放
      

  5.   

    对呀 int number,number1,number 应该都是放在栈里的,
    可是实际的运行结果,有时候是按高到低位入栈,有时候是由低到高位入栈。
    不知道我写的那两段代码有什么本质的区别。
      

  6.   

    lz,
    在理论上栈确实是向下增长,
    当局部变量多于两个的时候确实是向上增长,
    当局部变量为3,4,5多个时,就是正常情况
    这个应该是算唯一的一个特例吧,具体原因不详,我想可能是微软为了优化framework
      

  7.   

    int number = 1;
    int number2 = 2;int分配内存是随机的,哪有空闲内存就分到哪,在这本书里也讲到了。
    试一下
    struct
    {
    int number = 1;
    int number2 = 2;
    }
      

  8.   

    1 分配的顺序取决于在 IL 中的分配顺序而不是 C#里面的顺序。CSC在把C#代码变成IL代码时“不一定”按顺序(通过LayOut指定,默认情况下Class不按顺序Struct按顺序,可以修改)所以你分析这些问题应该用IL来分析而不是C#代码。
    2 堆  和   栈     是完全不同的数据结构, 而书里写 “堆栈”的,最好看看英文原本是写Stact 还是 Heap 
      

  9.   

    简单的说:你所有new的东西,都在堆里面
    你的变量,递归临时生成的东西,都在栈里面
    大学课程倒是轻松  ,一个"堆栈"全解决了
      

  10.   

    大学里讲的是数据结构的软件模拟堆栈,堆栈就是堆栈
    而在系统结构和操作系统的系统级编程里堆是stack,栈是heap
    好好回忆一下老师上课讲的吧
      

  11.   

    我做了实验,并没有出现楼主那种情况,一切都是正常的,从高位到低位,楼上诸位的意思是楼主连堆和栈都没弄懂。我想是误会了,关于堆和栈的区别如果没弄清楚也不会问这种问题。如果说MSIL不按顺序,那是有可能的。
    顺便问一下,C#中调用函数时的压栈顺序是什么样?相当于C中的_stdcall还是_cdecl?MSIL里看不出来.......学C#才2个月,很多东西感觉都不太明了-_-!。
        class Program
        {
         
            unsafe static void Main(string[] args)
            {
                int a = 1024;
                int b = 15;
     //           int c = 16;
                Console.WriteLine("address a:{0}", (int)&a);
                Console.WriteLine("address b:{0}", (int)&b);
     //           Console.WriteLine("address c:{0}", (int)&c);
            }
        }
      

  12.   

    引用楼上的话:堆是堆,栈是栈.
    值类型本来是放在栈中,不过你既然都拿他去COSOLE了,肯定就装箱放堆里了.
    兄弟,装箱操作你没看透啊.
      

  13.   

    为什么有人测试正常,
    有的人测试两种增长方向?
    我用的是.NET2.0,winXP 测试结果是2个变量时向上增长,3个向下增长
      

  14.   

    TO:Fortner
    抱歉,兄弟,看错了哈。
    沉默中,为我的草率道歉!
    学习ING