为什么-o与gcc改变输出

时间:2014-12-08 23:28:14

标签: c gcc

我在Mac OS X上使用C(版本10.6.8);这是一个小程序来测试你声明和int时会发生什么,但不要初始化它:

#include <stdio.h>

int main() {
    int a;
    printf("\n%d\n\n", a); 
}

当我gcc -std=c99 test.c; ./a.out时,我得到一个可预测的结果:unsigned int(32767)的最大值。但是,当我使用gcc -o时,会发生一些奇怪的事情。当我gcc -std=c99 test.c -o test.out; ./test.out时,我得到了其他内容:0

我知道我命名文件或编译方式并不重要,我已经想通了。如果名称 a.out,那么我会获得0。当名称为a.out时,我得到最大的uint类型或其他更大的数字。

与下面的一些想法相反,当编译文件为a.out时,这个数字是半随机的(大部分是最大的uint,但有时是更大的数字) 这真的很奇怪。它可能只是我的电脑;或者,也许,我幸运地 - 或者不幸的是 - 连续30次收到相同的结果。

1 个答案:

答案 0 :(得分:5)

程序的输出没有意义,并且从一次运行到下一次运行可能不一致。

严格地说,您的程序具有未定义的行为,因为它读取了从未初始化或分配给的对象的值。这意味着C标准对它将做什么一无所知。 (标准的笑话是,它原则上可以使恶魔飞出你的鼻子;当然这不会发生,但如果它发生了,它就不会违反C语言的规则。)

在实践中,可能发生的是打印的值将是程序开始运行时发生在内存中的任何垃圾。编译程序时使用或不使用-o 可能会或可能不会有效。同样,链接时的月相可能会也可能不会产生任何影响。

人们有时将这种垃圾称为“随机”,但该词具有特定的统计意义。打印的值是任意。每次运行程序时可能都是相同的,有时可能是0或其他任何内容。

您写道:

  

我得到了一个可预测的结果:unsigned int(32767)的最大值。

事实上,unsigned int的最大值至少 65535,更有可能是4294967295。 (请参阅UINT_MAX中定义的<limits.h>,了解系统的实际值。但这并不重要; 32767与任何其他垃圾值一样有效。

(如果您在文件范围内定义了a,或者使用static关键字定义0,那么它的初始值定义为static。“自动”变量(定义的那些)在没有{{1}}关键字的函数定义中,没有定义的初始值。