下面的代码在Turbo C编译器中给出无错误的输出,并给出变量的地址及其值:

int a=5,*fp;
fp=&a;
printf("%d %d\n",fp,*fp);


但是,当我使用GCC编译器在Linux中编译相同的代码时,会出现错误:

`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上运行。

最佳答案

printf()假定您将为signed int指定符传递%d

在所使用的平台和编译器上,int和指针的大小可能相同,并且printf()能够正确显示它。您的指针将重新解释为int。

在例如int是32位而指针是64位(例如x64上的gcc)的其他平台上编译和运行它的行为是不确定的。如果您足够幸运,它将崩溃。如果没有,您将得到垃圾。

关于c - 尝试打印指针时,Turbo C和gcc中printf()的不同行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30205212/

10-11 15:31