我正在使用C99进行编程,并在代码的一部分中使用可变长度数组。我知道在C89中不允许使用零长度数组,但我不确定C99和可变长度数组。
简而言之,以下是明确定义的行为吗?
int main()
{
int i = 0;
char array[i];
return 0;
}
答案 0 :(得分:13)
不,C语言明确禁止零长度数组,即使它们是通过运行时大小值创建为VLA(如代码示例中所示)。
6.7.5.2数组声明符
...
5 如果大小是不是整数常量的表达式 表达式:如果它出现在函数原型范围的声明中, 它被视为被*替换; 否则,每次都是 评估它的值应大于零。
答案 1 :(得分:2)
C中不允许使用零长度数组。静态类型数组必须具有固定的非零大小,这是一个常量表达式,而变长数组必须具有计算非零的大小。 C11 6.7.6.2/5:
每次评估[尺寸表达式]时,它应具有大于零的值
但是,C99和C11具有结构的灵活数组成员的概念:
struct foo
{
int a;
int data[];
};
从C11,6.7.21 / 18:
作为一种特殊情况,具有多个命名成员的结构的最后一个元素可以 有一个不完整的数组类型;这称为灵活的阵列成员。在大多数情况下, 灵活的数组成员被忽略。特别是,结构的大小就像是 省略了灵活的数组成员,除了它可能有更多的尾随填充 遗漏意味着。但是,当
.
(或->
)运算符具有左操作数时 (指向)具有灵活数组成员和右操作数名称的结构 成员,它的行为好像该成员被替换为最长的数组(具有相同的 元素类型)不会使结构大于被访问的对象;
答案 2 :(得分:1)
标准C中不允许使用零长度数组(甚至不是C99或C11)。但是gcc确实提供了允许它的扩展。见http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
struct line {
int length;
char contents[0];
};
struct line *thisline = (struct line *)
malloc (sizeof (struct line) + this_length);
thisline->length = this_length;