0
C++ は、空のインデックス表記またはインデックス表記 (ベンダー固有の拡張機能を除く)のいずれかを使用して、構造体の末尾にある C99 フレキシブル配列メンバーをサポートしません。
struct blah
{
int count;
int foo[]; // not valid C++
};
struct blah
{
int count;
int foo[0]; // also not valid C++
};
私の知る限り、C++0x もこれを追加しません。
ただし、配列のサイズを 1 要素にすると、次のようになります。
struct blah
{
int count;
int foo[1];
};
コードはコンパイルされ、非常にうまく機能しますが、技術的に未定義の動作です。オフバイワン エラーが発生する可能性が低い式を使用して、適切なメモリを割り当てることができます。
struct blah* p = (struct blah*) malloc( offsetof(struct blah, foo[desired_number_of_elements]);
if (p) {
p->count = desired_number_of_elements;
// initialize your p->foo[] array however appropriate - it has `count`
// elements (indexable from 0 to count-1)
}
そのため、C90、C99、および C++ の間で移植可能であり、C99 の柔軟な配列メンバーと同様に機能します。
Raymond Chen はこれについて素晴らしい記事を書きました:なぜいくつかの構造体はサイズ 1 の配列で終わるのですか?
注: Raymond Chen の記事では、「柔軟な」配列を初期化する例にタイプミス/バグがあります。それは読むべきです:
for (DWORD Index = 0; Index < NumberOfGroups; Index++) { // note: used '<' , not '='
TokenGroups->Groups[Index] = ...;
}