4

在 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 的情况,此代码是否有效?

4

1 回答 1

11

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

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

事实上,使用该标志为未定义行为clang启用消毒剂-fsanitize=undefined可以针对这种情况生成运行时警告,请现场查看

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

于 2014-06-06T13:08:50.410 回答