gpt4 book ai didi

c - wprintf : %p with NULL pointer

转载 作者:太空狗 更新时间:2023-10-29 17:09:19 24 4
gpt4 key购买 nike

当我写一个单元测试时,我偶然发现了 glibc 的一些奇怪的行为,关于 "%p"NULL 指针.

如果我有这样一行 printf("NULL pointer is %p\n", NULL);,然后我看到 NULL pointer is (nil) 被打印出来如我所料,出现在屏幕上。

如果我改为使用宽字符版本:wprintf(L"NULL pointer is %p\n", NULL);,那么它会打印出 NULL pointer is (,并在左括号处停止。如果我打印一个非 NULL 指针,它会打印该指针,包括普通版本和宽字符版本。这是 glibc< 的已知错误吗,还是我只是遗漏了什么?

注意:我知道 C 标准说带有 %p 的指针以实现定义的方式转换;只为 NULL 指针打印 ( 似乎很不寻常。

最佳答案

这绝对是一个错误:https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=stdio-common/vfprintf.c;hb=c15cf13a8a672bd27bf3d94b995c52872eed537d#l932

 934             /* Write "(nil)" for a nil pointer.  */                           \
935 string = (CHAR_T *) L_("(nil)"); \
936 /* Make sure the full string "(nil)" is printed. */ \
937 if (prec < 5) \
938 prec = 5; \
939 is_long = 0; /* This is no wide-char string. */ \
940 goto LABEL (print_string); \

对于 wprintf,L_("(nil)") 扩展为 L"(nil)",但几行之后 is_long 设置为 0(即 false)。结果 string 被解释为窄字符字符串,因此打印它将在其第一个零字节处停止,即在 ( 之后。

报告的错误链接:https://sourceware.org/bugzilla/show_bug.cgi?id=16890 - 这已在 glibc 的 2.20 版中修复。

有趣的是,这个错误似乎已经存在了将近 15 年,然后才被发现并修复 - 在报告后的 2 天内!

关于c - wprintf : %p with NULL pointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25002178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com