为何两次用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
相关产品推荐
相关产品推荐

