猿问

如果我在C/C+中定义了一个0大小的数组,会发生什么?

如果我在C/C+中定义了一个0大小的数组,会发生什么?

只是好奇,如果我定义了一个零长度数组,会发生什么?int array[0];用密码?GCC一点也不抱怨。

样本程序

#include <stdio.h>int main() {
    int arr[0];
    return 0;}

澄清

我实际上是想弄清楚,以这种方式初始化的零长度数组,而不是像Darhazer的注释中的可变长度那样,是否被优化了。

这是因为我必须发布一些代码到野外,所以我试图找出我是否必须处理SIZE定义为0,它发生在具有静态定义的代码中。int array[SIZE];

我其实很惊讶GCC没有抱怨,这就引出了我的问题。从我收到的答案来看,我认为没有警告很大程度上是因为支持没有用新的[]语法更新的旧代码。

因为我主要想知道这个错误,我把Lundin的答案标记为正确(Nawaz的答案是第一位的,但它没有那么完整)-其他人都指出了它在尾部填充结构中的实际用途,虽然它是相关的,但并不是我想要的。


慕沐林林
浏览 874回答 3
3回答

慕丝7291255

数组的大小不能为零。ISO 9899:2011 6.7.6.2:如果表达式是常量表达式,则其值应大于零。对于普通数组(第1段),上述案文都是正确的。对于VLA(可变长度数组),如果表达式的值小于或等于零(第5段),则不定义该行为。这是C标准中的规范文本。编译器不允许以不同的方式实现它。gcc -std=c99 -pedantic对非VLA案件提出警告。

qq_花开花谢_0

通常情况下,这是不允许的。然而,在C中使用柔性阵列.C99 6.7.2.1,第16节作为特例,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。示范:struct&nbsp;Array&nbsp;{ &nbsp;&nbsp;size_t&nbsp;size; &nbsp;&nbsp;int&nbsp;content[];};这样你就可以分配它:void&nbsp;foo(size_t&nbsp;x)&nbsp;{ &nbsp;&nbsp;Array*&nbsp;array&nbsp;=&nbsp;malloc(sizeof(size_t)&nbsp;+&nbsp;x&nbsp;*&nbsp;sizeof(int)); &nbsp;&nbsp;array->size&nbsp;=&nbsp;x; &nbsp;&nbsp;for&nbsp;(size_t&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;!=&nbsp;x;&nbsp;++i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;array->content[i]&nbsp;=&nbsp;0; &nbsp;&nbsp;}}您也可以静态地使用它(GCC扩展):Array&nbsp;a&nbsp;=&nbsp;{&nbsp;3,&nbsp;{&nbsp;1,&nbsp;2,&nbsp;3&nbsp;}&nbsp;};这也被称为尾垫结构(本术语早于C99标准的发布)或结构黑客(感谢JoeWreschnig指出这一点)。然而,这种语法直到最近才在C99中被标准化(并保证了效果)。在需要一个恒定的尺寸之前。1是便携的方式,虽然很奇怪0在表示意图方面做得更好,但就标准而言并不合法,一些编译器(包括GCC)将其作为扩展提供了支持。然而,尾部填充物的实践依赖于一个事实,即存储是可用的(小心)。malloc)我也是不适合在一般情况下叠加使用。

慕标琳琳

在标准C和C+中,零大小数组是不允许.。如果使用GCC,请用-pedantic选择。它会给警告,说:zero.c:3:6: warning: ISO C forbids zero-size array 'a' [-pedantic]在C+的情况下,也会给出类似的警告。
随时随地看视频慕课网APP
我要回答