This question already has answers here:
Why does sizeof(x++) not increment x?

(9个答案)


3年前关闭。




考虑请
#include <stdio.h>

int main(void) {
    int size = 1;
    int foo[1];
    int bar[size];

    int* pfoo = 0;
    int* pbar = 0;

    printf("%zu %zu\n", sizeof(pfoo = foo), sizeof(pbar = bar));
    printf("%p %p\n", pfoo, pbar);

    return 0;
}
https://ideone.com/VeiJXH上运行时的输出为

我期望将pbar设置为bar的第一个元素的地址,因为bar是可变长度数组。我认为sizeof是在运行时针对可变长度数组进行评估的,这意味着pbar将为非零。
这是怎么回事?这不是测验。这是我在代码中遇到的问题的简化版本。
编辑:我不认为重复在这里有帮助-我的问题是关于sizeof未被评估为可变长度数组。

最佳答案

赋值的类型为“赋值后左操作数的值”(第6.5.1 / 3节,添加了重点)。对于pbar = bar,左操作数的值为int*类型(因为pbar就是这种类型)。

关于sizeof运算符,“如果操作数的类型是可变长度数组类型,则对操作数进行求值;否则,不对操作数求值,并且结果是整数常量。” (第6.5.3.4/2节)。如上所述,操作数的类型是int*,它不是可变长度数组类型。因此没有评估。

以下确实是一个坏主意。但是,它给出了可能发生评估的情况的想法:

printf("%zu\n", sizeof(int[dim = x + y]));
printf("%d\n", dim);

08-17 00:20