You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何两次用printf打印同一变量地址却得到不同值?

printf格式不匹配引发的浮点变量打印异常

环境

  • gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)

触发异常的条件

  • 被打印的变量为float类型
  • printf中存在类型转换格式错误(如用%x打印float)
  • printf调用前缓冲区已刷新

编译命令

gcc floatTest.c -o floatTest -std=c99(使用c17、c11、c99标准结果一致)

测试代码

#include <stdio.h>

int main()
{
    float test = 5.0;
    printf("first print   test data is %x test %p\n", test, &test);
    //fflush(stdout);
    printf("second print  test data is %x test %p\n", test, &test);
}

程序输出

first print   test data is 37df33f4 test 0x7ffd37df3508
second print  test data is 37df33f4 test (nil)

现象总结

  • 当使用整数格式符%x打印float类型变量时,后续的指针参数&test会被错误打印为(nil)
  • 打印整数类型变量时无此异常,仅在同时满足浮点类型变量、printf格式不匹配、缓冲区已刷新这三个条件时触发
  • 测试不同gcc版本、切换C99/C11/C17标准均会出现该异常,但Visual Studio 2022编译运行未出现此问题

内容的提问来源于stack exchange,提问作者Alan Bai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:27:04