昔語り [日記]
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;
今日の一冊 | |
|
2009-08-24 07:42
nice!(0)
コメント(0)
トラックバック(0)
コメント 0