回答編集履歴

1 表現修正

Chironian

Chironian score 20550

2016/04/19 22:23  投稿

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る