VLAS与大面积操作数的副作用

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (15)

我知道sizeof绝不计算其操作数,除非在特定情况下,所述操作数是VLA。

void g(int n) {
    printf("g(%d)\n", n);
}

int main(void) {
    int i = 12;

    char arr[i]; // VLA

    (void)sizeof *(g(1), &arr); // Prints "g(1)"
    (void)sizeof (g(2), arr);   // Prints nothing

    return 0;
}
提问于
用户回答回答于

如何sizeof与VLA的交互实际上是正确的,正如下面的引号所证实的那样:

6.5.3.4sizeof_Alignof操作者 如果操作数的类型是可变长度数组类型,则计算操作数;否则,将不计算操作数,其结果是整数常量。

这并不是造成这种令人吃惊的行为的原因。

(void)sizeof (g(2), arr);

(g(2), arr)子表达式,逗号运算符将触发arr数组到指针的衰减。因此,sizeof的操作数不再是VLA,而是普通的char*,它又回到了不计算其操作数的问题上。

扫码关注云+社区