【发布时间】:2015-05-13 03:36:29
【问题描述】:
下面的代码给出了 Turbo C 编译器中没有错误的输出,并给出了变量的地址和它的值:
int a=5,*fp;
fp=&a;
printf("%d %d\n",fp,*fp);
但是当我在 Linux 中使用 GCC 编译器编译相同的代码时,它会报错:
`warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("%d %d\n",fp,*fp);`
但与 %p 格式说明符相同的代码在 GCC 编译器中工作,我同意这一点。问题是:它是如何在 Turbo C 平台上运行的?
附:问题不在于(在 Turbo C 中)未报告错误,而是在 Turbo C 上 它给出了一个有符号整数值,在重复执行程序时不会改变;会是垃圾吗?
P.P.S Turbo C 在 MSDOS 平台上运行,而 GCC 在 64 位 Linux 上运行,如果有帮助的话。
【问题讨论】:
-
未定义的行为不一定会导致您的编译器报告错误或警告。但这并不意味着您的代码被破坏的更少。
-
Gcc 不会发出错误。它发出一个警告,这根本不是一回事。当 Turbo C 不能识别和诊断 真正 问题时,它能够识别和诊断问题是实施质量的问题。
-
“代码实际打印内存位置的值”是什么意思?如果您说这是关于输出的,请显示一些输出示例。
-
它给出了一个有符号整数值,即使我反复执行程序,该值也没有改变,这意味着它不是垃圾?
-
printf("%d",fp,*fp);与printf("%d %d\n",fp,*fp);不是“相同的代码”