1

在著名的Struct hack中使用了不完整的数组类型,并且从 c99 标准开始就允许使用它们。在 c99 标准之前,这些是不允许的。我正在查看标准,但无法得出结论:

结构之外是否允许不完整的数组类型?(我在标准 C99:6.7.2.1.15 中找到的所有参考资料都将其作为结构中的最后一个元素进行讨论)。

那么是否允许按照标准编译以下程序?

int array[];
int main(){return 0;}

我的问题的第二部分是,如果允许这样做,则array保证能够存储它们类型的至少一个元素int

4

1 回答 1

3

是否允许按照标准编译以下程序?

是的,根据:

(C99, 6.9.2p5) "示例 2 如果在包含 int i[] 的翻译单元的末尾;数组 i 仍然具有不完整类型,则隐式初始化程序会导致它有一个元素,该元素在程序启动时设置为零。”

所以

int array[];
int main(){return 0;}

有效且等效于:

int array[1];
int main(){return 0;}

请注意,仅当array具有(如上)外部链接时才可以:

(C99,6.9.2p3)“如果对象标识符的声明是一个暂定定义并且具有内部链接,则声明的类型不应是不完整的类型。”

于 2013-03-09T15:29:20.977 回答