繁体   English   中英

为什么-o与gcc会更改输出

[英]Why does -o with gcc change output

我在Mac OS X(版本10.6.8)上玩C; 这是测试您声明和int但不初始化时会发生什么的小程序:

#include <stdio.h>

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

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

我弄清楚了该文件的名称或如何编译都没有关系。 如果名称不是 a.out ,那么我得到0 当名称为a.out我会得到最大的uint类型或其他更大的数字。

与下面的某些想法相反, 当编译文件为a.out时,该数字才是半随机的(多数为uint,有时为更大的数字),这确实很奇怪。 可能只是我的电脑。 或者,也许我幸运地(或不幸地)连续30次收到相同的结果。

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

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

实际上,很可能会发生的是,当程序开始运行时,打印出的值就是发生在内存中的任何垃圾。 编译程序时使用或不使用-o 可能会或可能不会有任何效果。 同样,链接时间的月相可能有也可能没有任何影响。

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

你写了:

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

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

(如果定义a at文件范围,或使用static关键字,则其初始值将定义为0 “自动”变量(在函数定义中定义的那些没有static关键字的变量)将没有定义的初始值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM