为什么将sizeof运算符应用于extern变量不会输出0

Viv*_*vek 6 c

以下代码的输出是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)

Eri*_*hil 8

a即使未在此模块中定义,我们也知道它的大小.sizeof不会告诉您已为此模块中的对象分配了多少内存.它告诉您对象需要多少内存.


dbu*_*ush 5

仅仅因为该变量未在此翻译单元中定义并不意味着编译器不知道其大小。如果没有,它将无法从中读取或写入。

sizeof运算符对任何变量或完整类型都有效,并且int是完整类型。另一方面,如果您有一个结构的前向声明:

struct mystruct;
Run Code Online (Sandbox Code Playgroud)

您无法计算,sizeof(struct mystruct)因为类型不完整,因此无法知道大小。


Joh*_*ode 5

两点:

  1. sizeof在编译时评估,而不是在运行时1.它不依赖于a实际分配的时间.这是因为...

  2. sizeof类型而不是对象进行操作.当操作数是对象表达式时a,使用该表达式的类型.同样,这一切都是在编译时完成的,当编译器知道表达式的类型时.


  1. 除了像VGA这样的可变修改类型.