«前の日記(2005年11月20日) 最新 次の日記(2005年11月22日)» 編集

日々をアレコレ


2005年11月21日

ポインタには気をつけろ!

ひどいミスをしてしまったので、忘れないようにメモ。

VC++で、ポインタ型変数の配列のためのメモリを別の関数で確保した上で、その関数内で各配列要素に値を導入するときの注意事項。元々のポインタ型変数の配列の先頭アドレスは、次のように宣言される(以下では、LONG型を例とする)。

LONG **lTmp;

この変数を、別の関数に渡して、その関数内でそのメモリを動的に確保する場合、さらにこの変数のポインタを関数に渡す必要があるので、引数としての宣言は次のようになる。

LONG ***lTmep

そして、このように宣言されて渡された配列変数の各要素に値を代入する場合は次のようにすること。

(*lTmep)[1] = 0;

あるいは、

*( *lTmep + 1 ) = 0;

次のようにしてしまうと、コンパイルエラーもワーニングもでないが、実行時に参照アドレスが誤ったものになる。

*lTmep[1] = 0;

この場合、lTemp[1]で表されるアドレスに対して、0を代入することになる。


«前の日記(2005年11月20日) 最新 次の日記(2005年11月22日)» 編集