读书人

VS2008中构造体是在stack上还是在heap

发布时间: 2011-12-22 23:36:25 作者: rapoo

VS2008中结构体是在stack上还是在heap上啊?
书上说C#的struct是值类型,运行在stack上,但是小弟写了一个unsafe的代码,分析struct的分配情况,居然发现struct的地址分配从低到高?难道struct在heap上分配资源
以下是代码:

C# code
using System;namespace Point{    class CurrencyClass    {        public long Dollars;        public byte Cents;        public override string ToString()        {            return "$" + Dollars + "." + Cents;        }    }    struct CurrencyStruct    {        public long Dollars;        public byte Cents;        public override string ToString()        {            return "$" + Dollars + "." + Cents;        }    }    class EnterPoint    {        static unsafe void Main()        {            Console.WriteLine("size of Currency struct is"+sizeof(CurrencyStruct));            CurrencyStruct amount1, amount2;            CurrencyStruct* pAmount = &amount1;            long* pDollars = &(pAmount->Dollars);            byte* pCents = &(pAmount->Cents);            Console.WriteLine("address of amount1 is 0x{0:X}",(uint)&amount1);            Console.WriteLine("address of amount2 is 0x{0:X}",(uint)&amount2);            Console.WriteLine("address of pAmount is 0x{0:X}",(uint)&pAmount);            Console.WriteLine("address of pDollars is 0x{0:X}",(uint)&pDollars);            Console.WriteLine("address of pCents is 0x{0:X}", (uint)&pCents);            pAmount->Dollars = 20;            *pCents = 50;            Console.WriteLine("amount1 contains" + amount1);            --pAmount;            Console.WriteLine("amount2 has address 0x{0:X} and contains {1}",(uint)pAmount,*pAmount);            CurrencyStruct* pTempCurrency = (CurrencyStruct*)pCents;            pCents=(byte*)(--pTempCurrency);            Console.WriteLine("Address of pCents is now 0x{0:X}",(uint)&pCents);            Console.WriteLine("\nNow with classes");            CurrencyClass amount3 = new CurrencyClass();            fixed (long* pDollars2 = &(amount3.Dollars))            fixed (byte* pCents2 = &(amount3.Cents))            {                Console.WriteLine("amount3.Dollars has address 0x{0:X}",(uint)pDollars2);                Console.WriteLine("amount3.Cents has address 0x{0:X}", (uint)pCents2);                *pDollars2 = -100;                Console.WriteLine("amount3 contains" + amount3);            }        }    }}



[解决办法]
你用的是指向CurrencyStruct的指针变量
[解决办法]
这个要看你struct里都是什么类型的变量
[解决办法]
如果含有不安全类型比如指针那应该是放在了非托管堆里...

读书人网 >C#

热点推荐