人気ブログランキング | 話題のタグを見る
(.Net)C#で変数のアドレスが知りたい
昔VB.Netでやってたときに、一回インスタンスのアドレスを調査したい時があったんですが、結局その方法が無くて困った経験があります。

C#だと、デバッガ中に知るのは超簡単です。
ウォッチウィンドウに &変数名 と入れると、そのアドレスを知ることができます。
参照型の場合は、ツリーを展開すれば参照先がわかります。
(.Net)C#で変数のアドレスが知りたい_e0091163_2143667.jpg


プログラム中で、変数のアドレス知りたいときはちょっと手順が必要です。

まず、調べたい方が基本型の場合は簡単です。
C# メモリアドレスを表示?にあるようにデバッグ時と同じで変数の前に&を付けるのと、unsafe キーワードでポインタの利用可能とします。
後は、ビルドオプションで、「アンセーフコードの許可」にチェックを入れるだけです。

面倒なのはString等参照型のアドレス取りたいときです。
C#では一応ポインタが扱えるようなので、その方法を用います。
ただし、この方法だとポインタの値(つまりインスタンスのアドレス)はわかるんですが、ポインタ自身のアドレスはわかりません。ポインタ自身のアドレスはデバッガのウォッチを使うしかなさそうです。

.Net ではヒープにたまるオブジェクトは自動メモリ管理機構の対象になるようで、CLRによって勝手に移動させられることがあるようです。(これを移動型と呼ぶらしいです。)
なので、オブジェクトを勝手に移動させないように、一時的に固定する必要あります。
それが fixed ステートメントのようです。

使い方はこんな感じです。
string str = "test";
fixed (char* p = str)
{
Console.WriteLine("ポインタの値:0x" + ((int)p).ToString("x"));
}


このようにコード内でポインタ使ってまでアドレス知りたいことはそうないので、ウォッチ式があれば十分ですね。

参考:
@IT:連載 改訂版 C#入門 第21章 ポインタを使用できる「安全でないコード」
by jehoshaphat | 2010-02-26 21:05 | .Net開発


<< (.Net)Stringの仕様... (Linux)tcpdumpで... >>