在C语言中,数组通常不允许大小为0(除非我使用一个或另一个编译器端扩展)。
噢,有些弗拉斯的长度可能是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;
    }
}

结果是一个长度为0、2、4或6的data数组,具体取决于标志的组合。
现在的问题是:对于数组长度为0的情况,此代码是否有效?

最佳答案

这是无效的,如果我们转到draft C99 standard部分6.7.5.2
数组声明符第5段说(强调我的):
如果大小不是整型常量的表达式
表达式:如果它出现在函数原型作用域的声明中,
它被视为被*代替;否则,每次
评估后,其值应大于零。[…]
实际上,使用clang标志为未定义的行为启用sanitizer可以为这种情况生成运行时警告:
运行时错误:可变长度数组绑定的计算结果为非正值0

09-10 04:43
查看更多