c - 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
导致输出差异?这是一贯的行为。
解决方案
在您的代码中,
scanf("%d", &second);
是未定义的行为。%d
期望参数是指向有符号整数类型 ( int
) 的指针。
引用C11
,第 7.21.6.2 章,fscanf
功能
[...] 除非由 a 指示分配抑制,否则
*
转换结果将放置在尚未收到转换结果的格式参数之后的第一个参数所指向的对象中。如果此对象没有适当的类型,或者转换的结果无法在对象中表示,则行为未定义。
也就是说,SCNu
N
宏是给fscanf
家庭的,fprintf()
家庭有对应的PRIu
N
。
推荐阅读
- php - Traefik PathPrefix 重定向到 apache
- apache-kafka - 使用 kafka 流的 Topic1 到 Topic2
- c# - Input.GetkeyDown 在没有按钮按下的情况下返回 true
- javascript - 在 2 秒延迟后,页面加载上的 Fade In Div 不起作用?
- android - 排行榜消息:“嗯,Play 游戏出了点问题”
- php - 我在正确的地方定义了 KERNEL_CLASS 吗?
- unit-testing - 是否需要告诉 Perl 编译器不要优化带有忽略返回值的函数调用?
- azure-active-directory - Azure 客户端凭据授予誓言在 Graph Mail API 访问的混合设置中不起作用
- filtering - DAX SUMMARIZE 函数在我的 Power BI 模型中不尊重基于行的安全性
- c# - WPF 按钮绑定到属性 Convertback IMultiValueConverter 不更新值