2012-02-12 5 views
1

sizeofとunsigned char配列エラー? (C/C++)私は、この構造を書かれている

struct bmpheader { 
    unsigned char magic[2]; 
    unsigned int fsize; 
    unsigned int unused; 
    unsigned int pixdata_offset; 
    unsigned int headersize; 
    unsigned int width; 
    unsigned int height; 
    unsigned short planes_color; 
    unsigned short bpp; 
    unsigned int compression; 
    unsigned int sizeofpix; 
    unsigned int resolutionx; 
    unsigned int resolutiony; 
    unsigned int colors; 
    unsigned int imp_colors; 
}; 

と私ははsizeof機能に問題があります。私の指でカウントしているとき、そのたびに私のために54バイト。 sizeof関数は毎回私に56を与えます。なぜですか?問題は、私は魔法[2]配列を削除すると、unsigned char配列で、sizeofは52ですか? sizeof(header.magic)は2と表示されています。私が知っている限り、unsigned charは1バイト型ですか?

返信いただきありがとうございます。

マルチン

+1

あなたの指で54までカウントできますか? –

+1

コンパイラは、構造体のレイアウトにパディングを挿入して、フィールドの整列性を向上させます。このパディングは、2つの魔法の文字と最初のintの間にあり、intがすべて4バイトの境界になるようにします。 –

+1

@SethCarnegie、私は自分の指で1024までカウントすることができます – Lol4t0

答えて

1

(あなたのマシン上)intがあること、または4バイトのアドレスに置かれたときに、より効率的である必要があるため。コンパイラはchar配列の後に2バイトのパディングを挿入します。

+0

強すぎる必要があります。コンパイラは、パフォーマンス上の理由から、必要性よりもむしろそうすることを選択します。 –

+0

ありがとう、私は答えを更新しました。 – Lindydancer

+0

Ah。すばらしいです。知っておいてよかった。ありがとうございました:P 今、その仕事; p そしてもう少し質問があります。 私は署名のないchar magic [2]を持っています。 魔法ではなく、一度に "BM"を書く方法[0] = 'B'、魔法[1] = 'M'?私は魔法= "BM"で試した。または魔法= {'B'、 'M'};両方とも動作しませんでした... – marxin

関連する問題