问题是我在看C#高级编程中遇到的。我先说下自己的理解:栈的地址分配是自高位到地位的遵循先入后出,堆的地址分配是地位到高位。垃圾回收管理中,会把已经释放在堆中的数据销毁,并把其他对象移动到堆的顶端。再次形成链接块。托管和非托管的区别。在书中有个示例:intrenal struct CurrencyStuct{public long Dollars;public byte Cents;public override string ToString(){return "$"+Dollars+"."+Cents;}}class CurrencyClass{//同上。此处未使用} CurrencyStruct amount1,amount2;CurrencyStruct*  pAmount=&amount1;.........输出:amount1的地址为:(uint)&amount1    //0x12F4A4 相对处于栈的高位amount2的地址为:(uint)&amount2    //0x12F494  相对处于栈的低位并相差16个字节,正好是CurrencyStruct在内存中分配的字节--pAmount
amount2的地址为:(uint)pAmount    //0x12F494 同样指向了amount2
---------------------------------------------------------------------------------------------------以上部分的理解似乎没有问题。继续看下面一个示例:说的是在栈上同c/c++一般高效率的值数组:double* pDoubles=stackalloc double[20];*pDoubles=3.0;pDoubles[1]=8.4   //这里按书上所写效果等同于*(pDoubles+1)=8.4
 上面写这么多,我的疑问就是在此,不论是struct还是上面的数组,他们都是分配在栈里的,先进后出,地址由高位到地位。但是上面的数组通过*(pDoubles+1)=8.4第二个项赋值,为什么不是我理解的*(pDoubles-1)=8.4,这里的理解来自:--pAmount指向第二个声明的结构 难道这个数组的分配格式如下:还有一个疑问,我并不清楚栈和堆的地址排列方式到底是怎么样的,并不是说分配。都是由低到高排列还是???在这里,我就自认为的把栈的地址排列方式认为是:栈的地址空间是有限的,所以我就由高到低麻烦解惑下。谢谢0x12F480=pDoubles+190x12F47F=pDoubles+18........0x12F470=pDoubles+30x12F46D=pDoubles分配内存的时候,最先入栈的是索引为19的项,索引为0的项最后入栈,并且指针指向了这里???希望有朋友给予指点下

解决方案 »

  1.   

    无论由高到低或反过来,
    一旦保留了一段区域(比如stackalloc double[20];),为那么非要从后往前读写?
      

  2.   

    数组是引用类型,栈上分配的仅仅是它的引用结构...数组实例都是在托管堆上分配...不管太纠结这些问题,更不要拿C/C++的指针来类比...GC有自己的内存管理机制,不能干预...
      

  3.   


    我看的示例,是说的是C#中使用指针,而我所说的数组示例就是基于堆栈的数组。
    如果使用C#默认的数组那就是基于堆的数组对象。而使用stackalloc关键字来指定.NET分配堆栈上一定的内存来使用。。
      

  4.   

    用C#应该把这些忘掉,我觉得用C++都尽量不要想这些,需要控制这些的时候,用C,