首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >sizeof操作数中的VLA和副作用

sizeof操作数中的VLA和副作用
EN

Stack Overflow用户
提问于 2015-06-24 20:57:36
回答 1查看 515关注 0票数 21

我知道sizeof从不计算它的操作数,除非在特定的情况下,所述操作数是VLA。或者,我以为我知道。

代码语言:javascript
复制
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;
}

怎么一回事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-24 21:06:11

看起来我应该在发帖前三思,因为在我发帖之后我就突然想到了。

我对sizeof如何与VLA交互的理解实际上是正确的,正如下面的引述所证实的那样(感谢@this !):

6.5.3.4 sizeof_Alignof运算符

如果操作数的类型是可变长度数组类型,则计算该操作数;否则,不计算该操作数,结果为整数常量

这并不是导致这种(对我来说)令人惊讶的行为的原因。

代码语言:javascript
复制
(void)sizeof (g(2), arr);

在VLA子表达式中,逗号运算符会触发arr的数组到指针的衰减。因此,sizeof的操作数不再是一个(g(2), arr),而是一个普通的char*,并且它回退到不计算它的操作数。

Apparently在C++中改变了这种行为,逗号运算符将不再衰减数组。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31027237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档