Re: 構造体のメンバの記憶域の順
いいじまです。
> > 構造体のメンバの記憶域は並べられた順に割り当てらることとなっていますが、
> > これには何か理由がありますか。
>
> struct foo {
> int a;
> int b;
> int c;
> char s[1];
> };
>
> のように構造体を宣言しておいて、任意の長さの領域を
> malloc()してからstruct foo *にキャストして使うなん
> てことをむかしのプログラムはよくやってました。つま
> りsに任意の長さの領域を割り当てたいからです。
昔どころか…Windows ではいまだに現役ですよ(笑)
とはいっても、可変長の構造体というのはこんな使い方↓をするのが普通ですが。
HOGE *pHoge=malloc(sizeof HOGE);
pHoge->dwSize = sizeof HOGE;
result = GetSomething(pHoge);
if (result == NULL) // 領域不足、dwSize に必要サイズが返される
{
pHoge = realloc(pHoge, pHoge->dwSize);
result = GetSomething(pHoge);
}
構造体 HOGE のサイズが Windows のバージョンアップとともに増えていくので、
古いコンパイラでコンパイルしたコードが新しいバージョンの Windows でも動
くようにするために、こういうトリックを使います。
逆に、SetSomething(pHoge) なんてコードを書くと、先頭の pHoge->dwSize バ
イトだけが認識されて、その先の領域(古いコンパイラでは領域確保されていな
いため、ゴミが入っている)は無視されます。
========================================================================
飯嶋 浩光 / でるもんた・いいじま http://www.ht.sakura.ne.jp/~delmonta/
IIJIMA Hiromitsu, aka Delmonta mailto:delmonta@ht.sakura.ne.jp
───【宣伝/ADVERTISEMENT】──────────────────────
fj.os.ms-windows.server2003 または fj.os.ms-windows.server の新設の可否
を問う投票を実施中です。
fj.news.group.comp をご参照のうえ、ふるってご投票ください。
投票期限は 8/25(月)です。
────────────────────────────────────
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735