C语言中连续两个printf,在C中两个连续的printf()调用的奇怪行为

Basile Stary..

7

你有一些未定义的行为(所以可能发生任意不好的事情,你不应该期待任何好事).随着对的printf函数期望(注意,当作为参数传递一个被晋升为一个),但是是文字型的.此外,不同的编译器(甚至同一编译器的不同版本)或不同的优化标志可能会产生不同的不良影响.%fdoublefloatdouble0int

(对未定义行为的良好态度是努力总是避免它;不要浪费时间去试图理解具体发生的事情;但是将UB视为非常肮脏或" 生病 "的东西,你总是避免)

要解释观察到的行为,您需要深入了解特定实现的细节,特别是ABI和调用约定(对于可变函数àla printf).另外,查看生成的汇编代码(使用GCC,编译gcc -fverbose-asm -S -O1); 有可能在一个不同于一个参数的寄存器(或一些调用堆栈槽)中传递一个double参数int(因此该printf函数正在使垃圾发生在该位置或寄存器中); 另请注意,通常sizeof(int)可能是4但sizeof(double)可能是8(因此数据量甚至不对).

为了避免这种错误,需要有良好的编译器(如编译的习惯GCC或锵/ LLVM在免费软件领域),并启用所有警告和调试信息(例如,编译使用gcc -Wall -Wextra -g与GCC).编译器会警告你.

BTW,void main()是非法的.它至少应该是int main(void)优选的int main(int argc, char**argv),你应该注意这些论点.

在您的示例中,gcc -Wall -Wextra(使用GCC 7)告诉(对于您的源文件april.c):

april.c:4:10: warning: return type of ‘main’ is not ‘int’ [-Wmain]

void main() {

^~~~

april.c: In function ‘main’:

april.c:5:14: warning:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值