質問: 2000; sizeof(*m_BmpPic);//3 fread(m_BmpPic->bmpfile, 1, sz, BMPFP);//2 send(s1, reinterpret_cast(m_BmpPic), sz + 18, 0);//1 free(m_BmpPic); fclose(BMPFP); ```
回答: こんにちは。 > > 1.4で2.5Mのビットマップを読み込ませるために構造体(bmpfile[])のサイズを変えているのですが、この方法ではサイズの変更はできないのでしょうか。 > > > この方法で実質的なサイズ変更は可能です。といいますか、昔からC言語で良く使われるテクニックですね。 > > 2.もし質問1の方法が正しいとしたら、なぜ3でサイズ変更前の値が返ってくるのでしょうか。 > > > sizeof()演算子はコンパイル時に値が計算されます。 `sizeof(*m_BmpPic);`と記述した場合、m_BmpPicが指すメモリ領域のサイズではなく、*mBmpPicの型(この場合、BMP_PIC)のサイズになります。 > > 3.1及び2の関数(send, fread)への引数への代入はこれで正しいでしょうか。 > > > 2は正しいように見えます。1は`18`という数字の意味にもよりますが、もしそれが、`sizeof(struct BMP_PIC) - 1`を意味している場合は期待通りの値になっていない可能性があります。 多くの処理系ではメンバ変数を配置する際、アクセスが高速になる位置に配置することが多いです。 そのような処理系では、unsigned longが4バイトの場合、4バイト境界(アドレスの下位2ビットが0)に配置されます。unsigned shortが2バイトだった場合、先頭のmarkerと次のsizeの間に2バイトのパディングが入る場合が多いです。アライメントと呼ばれます。 mallocの時と同様な計算式で計算されることをお勧めします。 > > 1の返り値は2500018を返しますが、受け取ったビットマップファイルには何も入っていませんでした > > > 上記ミスでは、恐らく最後の2バイトが欠けるだけですので、何も入っていないという状態にはならなさそうな印象です。小さい画像ファイルなら受け取れましたでしょうか?