请考虑
#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上运行时的输出是
8 8
(零)(无)
我希望将pbar
设置为bar
的第一个元素的地址,因为bar
是一个可变长度数组。我认为sizeof
在运行时被评估为可变长度数组,这意味着pbar
将为非零。
发生了什么?这不是一个小测验;它是我在代码中遇到的问题的缩减版本。
编辑:我不认为副本有帮助 - 我的问题是关于不对可变长度数组进行评估的尺寸。
答案 0 :(得分: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);