3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(.Net)C#で変数のアドレスが知りたい

VB.Netでやってたときに、一回インスタンスのアドレスを調査したい時があったんですが、結局その方法が無くて困った経験があります。

C#だと、デバッガ中に知るのは超簡単です。

ウォッチウィンドウに &変数名 と入れると、そのアドレスを知ることができます。

参照型の場合は、ツリーを展開すれば参照先がわかります。

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

まず、調べたい方が基本型の場合は簡単です。

C# メモリアドレスを表示?にあるようにデバッグ時と同じで変数の前に&を付けるのと、unsafe キーワードでポインタの利用可能とします。

後は、ビルドオプションで、「アンセーフコードの許可」にチェックを入れるだけです。

面倒なのはString等参照型のアドレス取りたいときです。

C#では一応ポインタが扱えるようなので、その方法を用います。

ただし、この方法だとポインタの値(つまりインスタンスのアドレス)はわかるんですが、ポインタ自身のアドレスはわかりません。ポインタ自身のアドレスはデバッガのウォッチを使うしかなさそうです。

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

なので、オブジェクトを勝手に移動させないように、一時的に固定する必要あります。

それが fixed ステートメントのようです。

使い方はこんな感じです。

string str = "test";

fixed (char* p = str)

{

Console.WriteLine("ポインタの値:0x" + ((int)p).ToString("x"));

}

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

参考:

@IT:連載 改訂版 C#入門 第21章 ポインタを使用できる「安全でないコード」