首页 > 解决方案 > uint16_t 与 printf 值的差异

问题描述

下面程序的输出令人困惑。

uint16_t        first = 10, second = 20, third = 30;
// printf("%p\n", &first);
scanf("%d", &second);       // "%d" used intentionally.
printf("%" SCNu16 " ", first);
printf("%" SCNu16 " ", second);
printf("%" SCNu16 "\n", third);

首先printf评论我得到10 20 0。("%d"inscanf可能是造成这种情况的原因。如果我使用"%" SCNu16它代替 ,它可以正常工作%d)。

首先printf未注释我得到0 20 30. 困惑是 - 为什么会printf导致输出差异?这是一贯的行为。

标签: cgccprintfscanf

解决方案


在您的代码中,

 scanf("%d", &second); 

是未定义的行为。%d期望参数是指向有符号整数类型 ( int) 的指针。

引用C11,第 7.21.6.2 章,fscanf功能

[...] 除非由 a 指示分配抑制,否则*转换结果将放置在尚未收到转换结果的格式参数之后的第一个参数所指向的对象中。如果此对象没有适当的类型,或者转换的结果无法在对象中表示,则行为未定义。

也就是说,SCNuN宏是给fscanf家庭的,fprintf()家庭有对应的PRIuN


推荐阅读