int main()
{
extern long long a;
a=100000000000; //10 raised to power 11
printf("%lld",a);
return 0;
}
int a;
输出:100000000000
int a 表示定义,会为变量 a 分配 4 个字节,而 extern long long a 是声明变量类型,与内存分配无关。因此,如果我将值 10^11 分配给 a(4 字节大),它不应该导致溢出吗?
是的,它确实会导致溢出。幸运的是,您的程序足够短,以至于您没有注意到损坏。
您的代码将 8 个字节写入一个 4 字节变量。a
这将在内存中的任何内容上涂鸦。在您的情况下, 之后没有声明a
,因此它可能会写在可用空间上,但这不能保证。不管怎样,对于成功完成你的程序,似乎没有什么关键取决于该记忆。
一些编译器可能能够检测到这一点,但有些则不能。在一般情况下, wherea
在不同的源文件中声明,这是无法检测到的。这就是为什么最好将extern
声明放在头文件中,然后将该头文件包含在声明真实变量的源文件以及使用它的源文件中的原因;这样编译器就有机会检查声明是否匹配。