不完整的数组类型保证能够存储一个元素吗?

时间:2013-03-09 15:27:20

标签: c arrays incomplete-type

不完整的数组类型 用于着名的 Struct hack ,自c99起允许使用标准。在c99标准之前,这些是不允许的。我正在看标准,我无法得出结论:

结构外是否允许不完整的数组类型?(我在标准C99中找到的所有引用:6.7.2.1.15将它作为结构中的最后一个元素)。

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

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

我的问题的第二部分是,如果允许,array保证能够存储 至少一个 元素的int }。

1 个答案:

答案 0 :(得分:3)

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

是的,按照:

  

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

所以

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

有效且等同于:

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

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

  

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