C++ 不支持结构末尾的 C99 灵活数组成员,使用空索引表示法或0
索引表示法(除非供应商特定的扩展):
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] = ...;
}