我认为sizeof的参数是针对可变长度数组进行评估的

Seb*_*ard 2 c

请考虑一下

#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;
}
Run Code Online (Sandbox Code Playgroud)

https://ideone.com/VeiJXH上运行时的输出是

8 8

(无)(零)

我期望pbar被设置为第一个元素的地址bar,因为它bar是一个可变长度数组.我认为sizeof在运行时对可变长度数组进行了评估,这意味着pbar它将是非零的.

这是怎么回事?这不是一个小测验; 这是我在代码中遇到的问题的简化版本.

编辑:我不认为副本有帮助 - 我的问题是关于sizeof不被评估为可变长度数组.

ric*_*ici 7

赋值的类型是"赋值后左操作数的 "(§6.5.16/ 3,强调添加).在这种情况下pbar = bar,左操作数的值是类型int*(因为那是什么pbar).

对于sizeof运算符,"如果操作数的类型是可变长度数组类型,则计算操作数;否则,不评估操作数,结果是整数常量." (§6.5.3.4/ 2).如上所述,操作数的类型是int*,它不是可变长度数组类型.所以不进行评估.

以下是一个坏主意.但它给出了评估将发生的环境的概念:

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