說到M.Elmi在評論中說過的話,我已經將結構放入非託管內存中了。不幸的是,我不知道如何檢查,它是在堆或堆棧或諸如此類的東西,但它肯定坐在現在非託管內存...
static void Main(string[] args)
{
SuperStruct myStruct = new SuperStruct() { MyName = "Dan", MyNumber = 1 };
SuperStruct myOtherStruct;
IntPtr pointer = Marshal.AllocHGlobal(Marshal.SizeOf<SuperStruct>());
Marshal.StructureToPtr(myStruct, pointer, false);
myOtherStruct = Marshal.PtrToStructure<SuperStruct>(pointer);
Console.WriteLine($"Name: {myOtherStruct.MyName}, Number: {myOtherStruct.MyNumber}.");
Console.ReadLine();
}
struct SuperStruct
{
public int MyNumber;
public string MyName;
}
總體而言,其過程是:1)設置一些非託管內存準備通過使用Marshal.AllocHGlobal
來包含數據。 2)使用Marshal.StructureToPtr
方法設置該內存。 3)使用Marshal.PtrToStructure<T>
方法從非託管內存中檢索該結構。
它也被指出(由M.Elmi在評論),我們可以宣佈一個類型的指針,只要有不包含在結構定義的託管類型,像這樣:
unsafe
{
SuperStruct* ptr = (SuperStruct*)pointer.ToPointer();
}
在我的具體示例中,string
字段阻止您使用此聲明,但值得放在後面。
可能的重複https://stackoverflow.com/questions/4853213/are-structs-always-stack-allocated-or-sometimes-heap-allocated –
@Sinatr這個問題與你提到的不一樣。 – melmi
@丹瑞森這個問題是相關的,但不相同。我知道哪裏可以分配一個結構。但這不是重點。我真正想要的是一個指向該結構的指針。 – melmi