同一のアドレスを示すポインタについて

解決


臼井  2003-09-09 00:10:06  No: 52103  IP: [192.*.*.*]

同一のアドレスを示すポインタについて

環境:WindowsXP、VC.NET、MFC不使用

DIBを使うプログラムを作っています。
DIBとは直接関係の無い質問内容かもしれませんがお願いします。


//グローバル変数
LPBITMAPINFO lpInfo;
LPBYTE lpBuff;
LPBYTE lpBit;

//ウインドウプロシージャ内
  case WM_CREATE:
     // 必要なメモリをまとめて確保
    lpBuff=(LPBYTE)GlobalAlloc(GPTR,sizeof(BITMAPINFO)+128*128*3);
    
    //BitmapInfoのアドレスを設定
    lpInfo=(LPBITMAPINFO)lpBuff;
    
    //画像データのアドレスを設定
    lpBit=(LPBYTE)(lpBuff+sizeof(BITMAPINFO));//<-----(1)


これをデバックで見ると
lpBuff  0x00145400""
lpInfo  0x00145400
lpBit   0x0014542c""
となっていました

lpBuffとlpInfoは同じアドレスなので(1)を

    lpBit=(LPBYTE)(lpInfo+sizeof(BITMAPINFO));//<----(2)

と書き換えて見たのですがデバッカだと
lpBuff  0x00145400""
lpInfo  0x00145400
lpBit   0x00145b90""

となり、lpBitのアドレスが最初と異なり、メモリのエラーが発生しました
lpBuffとlpInfoは同一のアドレスを示すため、
(1)と(2)は同じ動作をする思っていたのですが違うのでしょうか?

また、アドレスの後部に付いている""はどういった意味なのでしょうか?

よろしくお願いします。

編集 削除
YuO  2003-09-09 01:27:23  No: 52104  IP: [192.*.*.*]

> //グローバル変数
> LPBITMAPINFO lpInfo;
> LPBYTE lpBuff;
> LPBYTE lpBit;

だから,
>         //画像データのアドレスを設定
>         lpBit=(LPBYTE)(lpBuff+sizeof(BITMAPINFO));//<-----(1)

は,
lpBit = &(lpBuff[sizeof(BITMAPINFO)]);
と,

>         lpBit=(LPBYTE)(lpInfo+sizeof(BITMAPINFO));//<----(2)

は,
lpBit = &(lpInfo[sizeof(BITMAPINFO)]);
と同じです。

lpInfoはBITMAPINFO *型だから,
アドレス値はsizeof(BITMAPINFO) * sizeof(BITMAPINFO)だけ先に進みます。

lpBit = (LPBYTE)lpInfo + sizeof(BITMAPINFO);
とか,
lpBit = ((LPBYTE)lpInfo) + sizeof(BITMAPINFO);
なんてやれば,(1)と同じ動作をします。

ポインタに型があることをちゃんと認識して下さい。


> lpBuffとlpInfoは同一のアドレスを示すため、
> (1)と(2)は同じ動作をする思っていたのですが違うのでしょうか?

違います。


> また、アドレスの後部に付いている""はどういった意味なのでしょうか?

char * / signed char * / unsigned char *型(とwchar_t *型もかな?)に関して,
文字列とみなして中身を表示しています。

編集 削除
臼井  2003-09-09 04:23:14  No: 52105  IP: [192.*.*.*]

ご教授有難う御座います
lpBit=(LPBYTE)(lpInfo + sizeof(BITMAPINFO));

これを
lpInfoのアドレスにsizeof(BITMAPINFO)をプラスする
と思っていたのが間違いで

実際は
lpInfoのアドレスからlpInfoのサイズ*sizeof(BITMAPINFO)分アドレスを
移動させると考えるべきでした

分かりやすいご説明有難う御座いました。

編集 削除