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

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

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

我知道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*,它又回到了不计算其操作数的问题上。

所属标签

可能回答问题的人

  • 红双喜经典VS中华

    1 粉丝0 提问8 回答
  • 浮生长恨欢娱少

    个人站长 · 站长 (已认证)

    51 粉丝2 提问4 回答
  • 滑稽园扛把子

    Swoole Inc · PHP工程师 (已认证)

    135 粉丝0 提问4 回答
  • 13火麒麟

    0 粉丝0 提问4 回答

扫码关注云+社区