在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;
}
}
结果是一个data
数组,长度为0,2,4或6,具体取决于标志的组合。
现在的问题是:对于数组结果长度为0的情况,这个有效代码是什么?
答案 0 :(得分:10)
如果我们转到draft C99 standard部分6.7.5.2
,这是无效的
数组声明符段 5 表示(强调我的):
如果大小是不是整数常量的表达式 表达式:如果它出现在函数原型范围的声明中, 它被视为被*替换;否则,每次都是 评估它应具有大于零的值。[...]
事实上clang
使用-fsanitize=undefined
标志启用sanitizer未定义的行为可以为此案例see it live生成运行时警告:
运行时错误:可变长度数组绑定计算为非正值0