2009-12-30 55 views
1

我正在學習有關C#的更多信息,並且想知道如何顯示參考的實際值或結構的地址。我期待的是類似於以下C代碼的東西:如何在C#中顯示參考的實際值

int i; 
    printf("int i resides at memory location %x",&i); 
+1

C#中沒有這樣的東西# – 2009-12-30 03:20:56

+0

你想完成什麼?你想學什麼?你可能無法以這種方式學習它。 – 2009-12-30 03:42:00

+0

我想看看多維字符串數組是如何存儲在堆上的。我是一個嵌入式的人,喜歡看事情的發展。 – tkyle 2009-12-30 03:49:09

回答

8

在一個unsafe背景下,這將在C#中的工作:

int i = 10; 
int *ptr = &i; 
Console.WriteLine((int)ptr); 

我不知道它是否能夠在安全的前提下進行,或者,如果是這樣,怎麼(我懷疑它不能)。

+0

在一個非平凡的應用程序中,這是否會保持不變?我會假設如果這個存活到第二代,它可能是不變的,但在此之前它可能會移動。我從來沒有嘗試過。 – GrayWizardx 2009-12-30 03:31:58

+2

C#規範的第18.3節對此進行了相當徹底的解釋。看看「固定」的說法。 http://msdn.microsoft.com/en-us/library/f58wzh21.aspx。它歸結爲指針是否正在查看GC認爲可以移動或不移動的內容。 – Gregory 2009-12-30 04:26:17

+4

發佈的代碼將顯示堆棧的內容,而不是GC堆。創建一個指向引用類型的指針需要先釘住它。那是Heisbergian,你現在不再看堆的正常佈局。使用sos.dll調試器擴展,!dumpheap命令。 – 2009-12-30 04:34:51

6

這不能在C#中完成,我知道這一點。 .NET認爲它適合於移動存儲塊,因此變量的地址最多隻能具有臨時含義。

0

雖然你可以在某些情況下做到這一點,但結果很大程度上沒有意義。如前所述,References are not addresses - 或者至少,他們不是。所以,即使它有效,你所嘗試的內容也不能保證所有的實現,並且通常不是特別有用。如果你不銷,該值是不可靠的,如果你做你改變你的報告非常的事......

真的,你應該使用不同的工具的語言例如... windbg + SOS。

相關問題