长度为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