【发布时间】:2014-07-27 18:24:09
【问题描述】:
在 C 中,通常不允许数组的大小为 0(除非我使用一个或其他编译器端扩展)。
OTOH,有些 VLA 的长度可能会变成 0。
他们允许吗?
我说的是下面的代码:
void send_stuff()
{
char data[4 * !!flag1 + 2 * !!flag2];
uint8_t cursor = 0;
if (flag1) {
// fill 4 bytes of data into &data[cursor]
cursor += 4;
}
if (flag2) {
// fill 2 bytes of data into &data[cursor]
cursor += 2;
}
}
结果是一个 data 数组,长度为 0、2、4 或 6,具体取决于标志的组合。
现在的问题是:对于数组长度为 0 的情况,此代码是否有效?
【问题讨论】:
-
@AntonH 它不适用,因为它是关于结构中的数组,而不是 variable-length 数组。
-
@AntonH 这与此无关。这个问题是关于编译器扩展的,它在 C99 之前是合理的。这个问题是关于可变长度数组的,它只在 C99 中可用。两者之间没有没有交集。
-
@glglgl 我的错,读得太快了。
-
@pascal-cuoq 我的错,读得太快了。
-
顺便说一句:建议的解决方法:
char data[1 + 4 * !!flag1 + 2 * !!flag2];。当然,这在以后调用sizeof data时会遇到麻烦。
标签: c c99 language-lawyer variable-length-array