我正在学习有关C#的更多信息,并且想知道如何显示参考的实际值或结构的地址。我期待的是类似于以下C代码的东西:如何在C#中显示参考的实际值
int i;
printf("int i resides at memory location %x",&i);
我正在学习有关C#的更多信息,并且想知道如何显示参考的实际值或结构的地址。我期待的是类似于以下C代码的东西:如何在C#中显示参考的实际值
int i;
printf("int i resides at memory location %x",&i);
在一个unsafe
背景下,这将在C#中的工作:
int i = 10;
int *ptr = &i;
Console.WriteLine((int)ptr);
我不知道它是否能够在安全的前提下进行,或者,如果是这样,怎么(我怀疑它不能)。
在一个非平凡的应用程序中,这是否会保持不变?我会假设如果这个存活到第二代,它可能是不变的,但在此之前它可能会移动。我从来没有尝试过。 – GrayWizardx 2009-12-30 03:31:58
C#规范的第18.3节对此进行了相当彻底的解释。看看“固定”的说法。 http://msdn.microsoft.com/en-us/library/f58wzh21.aspx。它归结为指针是否正在查看GC认为可以移动或不移动的内容。 – Gregory 2009-12-30 04:26:17
发布的代码将显示堆栈的内容,而不是GC堆。创建一个指向引用类型的指针需要先钉住它。那是Heisbergian,你现在不再看堆的正常布局。使用sos.dll调试器扩展,!dumpheap命令。 – 2009-12-30 04:34:51
这不能在C#中完成,我知道这一点。 .NET认为它适合于移动存储块,因此变量的地址最多只能具有临时含义。
虽然你可以在某些情况下做到这一点,但结果很大程度上没有意义。如前所述,References are not addresses - 或者至少,他们不有是。所以,即使它有效,你所尝试的内容也不能保证所有的实现,并且通常不是特别有用。如果你不销,该值是不可靠的,如果你做针你改变你的报告非常的事......
真的,你应该使用不同的工具外的语言例如... windbg + SOS。
C#中没有这样的东西# – 2009-12-30 03:20:56
你想完成什么?你想学什么?你可能无法以这种方式学习它。 – 2009-12-30 03:42:00
我想看看多维字符串数组是如何存储在堆上的。我是一个嵌入式的人,喜欢看事情的发展。 – tkyle 2009-12-30 03:49:09