SSブログ

昔語り [日記]

Visual C++ にある WinSock2.h というヘッダファイルに、次のような構造体の定義があります。

typedef struct _SOCKET_ADDRESS_LIST {
    INT             iAddressCount;
    SOCKET_ADDRESS  Address[1];
} SOCKET_ADDRESS_LIST, FAR * LPSOCKET_ADDRESS_LIST;

これを見て、ある人が、こんなことを言っていました。

型名にLISTって付いているのに、実際には1つしかデータを格納できないじゃないか(ぷ

そう言えば、C++を使うようになって、この“テクニック”は使わなくなったなぁ……。

ちなみに、こういう使い方をします。

int DATA_SIZE = 3;    // 構造体で保持するデータの個数

SOCKET_ADDRESS_LIST *list = (SOCKET_ADDRESS_LIST *)malloc(sizeof(SOCKET_ADDRESS_LIST) + sizeof(SOCKET_ADDRESS)*(DATA_SIZE - 1));

list->iAddressCount = DATA_SIZE;

...

list->Address[0];
list->Address[1];
list->Address[2];

...

free(list);

C言語は配列の範囲チェックを行わないという性質を利用した高等技術、もとい裏技です。

この手法を使うことを明確にするために、(独自拡張だったと思うのですが)GCCでは、サイズ=0の配列が定義できました。

typedef struct _SOCKET_ADDRESS_LIST {
    INT             iAddressCount;
    SOCKET_ADDRESS  Address[0];
} SOCKET_ADDRESS_LIST;
[車(セダン)] 今日の一冊
確率モデルって何だろう―複雑系科学への挑戦

確率モデルって何だろう―複雑系科学への挑戦

  • 作者: 今野 紀雄
  • 出版社/メーカー: ダイヤモンド社
  • 発売日: 1995/11
  • メディア: 単行本(ソフトカバー)

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。