为什么-o与gcc改变输出

 fgsZHdgsz 发布于 2022-12-07 11:47

我在Mac OS X上使用C(版本10.6.8); 这是一个小程序,用于测试在声明int但未初始化时发生的情况:

#include 

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

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

我发现,无论我将文件命名为什么或如何编译它都没关系.如果名字不是 a.out,那我得到0.当名称是a.out我得到最大的uint类型或一些其他更大的数字.

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

1 个回答
  • 程序的输出没有意义,并且从一次运行到下一次运行可能不一致.

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

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

    人们有时将这种垃圾称为"随机",但该词具有特定的统计意义.打印的值是任意的.每次运行程序时可能会发生相同的情况,有时候可能会0或者其他任何情况.

    你写了:

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

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

    (如果您已a在文件范围或static关键字中定义,则它将具有明确定义的初始值0."自动"变量(在没有static关键字的函数定义内定义的变量)没有定义的初始值.

    2022-12-11 02:57 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有