长度为0的可变长度数组?

在C中,通常不允许数组的大小为0(除非我使用一个或其他编译器端扩展)。

OTOH,有长度可能为0的VLA。

他们被允许吗?

我在谈论以下代码:

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; } } 

结果是一个长度为0,2,4或6的data数组,具体取决于标志的组合。

现在的问题是:对于数组结果长度为0的情况,这个有效代码是什么?

这是无效的,如果我们去草案C99标准部分6.7.5.2 数组声明者5段说( 强调我的 ):

如果size是一个不是整型常量表达式的表达式:如果它出现在函数原型范围的声明中,则将其视为*被替换为*; 否则,每次评估时,其值应大于零 。[…]

事实上,使用-fsanitize=undefined标志为clang启用未定义行为的-fsanitize=undefined可以为此案例生成运行时警告, 请查看它 :

运行时错误:变量长度数组绑定计算为非正值0