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

时间:2014-06-06 13:04:57

标签: c c99 language-lawyer variable-length-array

在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的情况,这个有效代码是什么?

1 个答案:

答案 0 :(得分:10)

如果我们转到draft C99 standard部分6.7.5.2,这是无效的 数组声明符 5 表示(强调我的):

  

如果大小是不是整数常量的表达式   表达式:如果它出现在函数原型范围的声明中,   它被视为被*替换;否则,每次都是   评估它应具有大于零的值。[...]

事实上clang使用-fsanitize=undefined标志启用sanitizer未定义的行为可以为此案例see it live生成运行时警告:

  

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