2009-12-30 4 views
1

저는 C#에 대해 더 많이 배우는 중이며 참조 또는 구조체의 주소의 실제 값을 표시하는 방법을 알고 있습니다. 내가 찾고있는 건 다음 C 코드와 유사하다.C#에서 참조의 실제 값을 표시하려면 어떻게해야합니까?

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

C#에는 그런 것이 없습니다. –

+0

무엇을하려고합니까? 너는 무엇을 배우려고하니? 이런 식으로 배울 수는 없습니다. –

+0

다중 차원 문자열 배열이 힙에 저장되는 방식을 확인하려고합니다. 나는 임베디드 녀석과 같은 것들을 보러 갈 것입니다. – tkyle

답변

8

,이 C#으로 작동합니다

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

내가 만약 그렇다면, 어떻게 (나는 그것을 할 수없는 의심,이 안전한 환경에서 수행 할 수 있는지 알고하지 않거나).

+0

평범하지 않은 응용 프로그램에서 이것이 일정합니까? 나는 이것이 gen 2에서 살아남은다면 그것은 일정 할 수도 있지만 그 전에는 움직일 수 있다고 생각할 것이다. 나는 그것을 결코 시도하지 않고 있었다. – GrayWizardx

+2

C# 스펙의 18.3 절에서이를 아주 자세히 설명합니다. "고정 된"문장을보십시오. http://msdn.microsoft.com/en-us/library/f58wzh21.aspx. 그것은 포인터가 GC가 움직일 수 있는지 없는지를보고 있는지 여부로 귀결됩니다. – Gregory

+4

게시 된 코드에 GC 힙이 아닌 스택의 내용이 표시됩니다. 참조 유형에 대한 포인터를 작성하려면 먼저 참조 유형을 고정해야합니다. Heisbergian입니다. 이제 더 이상 힙의 일반적인 레이아웃을보고 있지 않습니다. sos.dll 디버거 확장,! dumpheap 명령을 사용하십시오. –

6

이것은 알고있는 C#에서는 할 수 없다. .NET은 저장 영역 조각이 자유롭게 움직이는 것처럼 보이기 때문에 변수의 주소는 기껏해야 일시적인 의미만을 담고 있습니다. unsafe 맥락에서

0

수 있습니다. 일부 컨텍스트에서 이렇게하면 결과는 크게 의미가 없습니다. 언급했듯이 References are not addresses - 또는 적어도 이되지 않습니다. 따라서 시도하고있는 것은 작동한다고해도 모든 구현에 대해 보장되는 것은 아니며 일반적으로 특히 유용하지는 않습니다. 당신이 핀하지 않는 경우, 값은 신뢰할 수 없습니다, 당신은 당신이보고하는 바로 그 일을 변경 핀 ... 정말

경우에는 외부의 다른 도구 언어에 대한을 사용한다 이 ... windbg + SOS, 예를 들면.

관련 문제