wprintf:%p 带有 NULL 指针
题
当我编写单元测试时,我偶然发现了一些奇怪的行为 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
指针。
解决方案
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); \
这 L_("(nil)")
扩展到 L"(nil)"
对于 wprintf,但几行之后 is_long
被设定为 0
(IE。错误的)。因此 string
被解释为窄字符串,因此打印它将停止在第一个零字节处,即之后 (
.
报告的错误链接: https://sourceware.org/bugzilla/show_bug.cgi?id=16890 - 这在 glibc 2.20 版本中已修复。
有趣的是,这个 bug 似乎已经存在了近 15 年才被发现并修复——报告后 2 天内!
不隶属于 StackOverflow