using System;class test
{
   public static unsafe void Main()
   {
      CurrencyStruct amount1;
      CurrencyStruct amount2;
      CurrencyStruct amount3;
      //CurrencyStruct* pAmount = &amount1;
      Console.WriteLine("amount1:"+(uint)&amount1);
      Console.WriteLine("amount2:"+(uint)&amount2);
      Console.WriteLine("amount3:"+(uint)&amount3);
      //Console.WriteLine("pAmount:"+(uint)&pAmount);
      Console.ReadLine();
   }
}   struct CurrencyStruct
   {
      public long a;
      public byte b;
   }
运行以上代码,得出的结果是:
amount1:1242748
amount2:1242764
amount3:1242780
在堆栈上,不是按变量的声明顺序向下填充的吗?怎么以上结果是升序的?把代码中的注释去掉,得出的结果是:
amount1:1242776
amount2:1242760
amount3:1242744
pAmount:1242740
前三个变量的地址完全变了,而且是降序的,是什么原因呢,谁能解释一下?

解决方案 »

  1.   

    在VS2005下测试都是从大到小地址以降序出现,由于struct是值类型,变量保存在堆栈中,因此向下填充是对的。另外,没有出现你说的排序方式改变现象,在2003中应该也是这样的吧。
      

  2.   

    那结果是在命令行下用csc编绎的
      

  3.   

    我用2005试了一下 没有你说的情况    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();            test.testa(txtInfo);
            }
        }class test
    {
       public static unsafe void testa( TextBox t)
       {
          CurrencyStruct amount1;
          CurrencyStruct amount2;
          CurrencyStruct amount3;
          //CurrencyStruct* pAmount = &amount1;
          t.AppendText("amount1:"+(uint)&amount1 + "\n");
          t.AppendText("amount2:" + (uint)&amount2 + "\n");
          t.AppendText("amount3:" + (uint)&amount3 + "\n");
          //t.AppendText("pAmount:" + (uint)&pAmount + "\n");      //Console.WriteLine("amount1:"+(uint)&amount1);
          //Console.WriteLine("amount2:"+(uint)&amount2);
          //Console.WriteLine("amount3:"+(uint)&amount3);
         //Console.WriteLine("pAmount:"+(uint)&pAmount);
         // Console.ReadLine();
       }
      

  4.   

    在2003的命令行下用csc编绎试试