以下代码的输出是4.不应该0吗?
由于a已声明且未定义,因此未为其分配内存.
#include <stdio.h>
#include <stdlib.h>
int main()
{
extern int a;
printf("%ld",sizeof(a));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
仅仅因为该变量未在此翻译单元中定义并不意味着编译器不知道其大小。如果没有,它将无法从中读取或写入。
该sizeof运算符对任何变量或完整类型都有效,并且int是完整类型。另一方面,如果您有一个结构的前向声明:
struct mystruct;
Run Code Online (Sandbox Code Playgroud)
您无法计算,sizeof(struct mystruct)因为类型不完整,因此无法知道大小。
两点:
sizeof在编译时评估,而不是在运行时1.它不依赖于a实际分配的时间.这是因为...
sizeof对类型而不是对象进行操作.当操作数是对象表达式时a,使用该表达式的类型.同样,这一切都是在编译时完成的,当编译器知道表达式的类型时.