以下内容:
printf("Example%s\n",NULL);
printf("%s\n",NULL);
我得到的输出为:
Example(null)
Segmentation Fault
当我在GDB中尝试回溯时,显示printf()
转换为puts()
。但我似乎无法理解为什么会这样。
BTW我发现了this文章,但似乎仍然没有意义。
答案 0 :(得分:15)
标准说将NULL
指针作为参数传递给printf
%s
说明符是未定义的行为 1 (即任何事情都可能发生),所以这两种行为都是合法的。
在第一种情况下,标准库(特别是printf
代码)通过打印(null)
为您提供帮助。
在第二种情况下,优化程序会理解您的printf
可以替换为puts
(效率更高),而不会对程序的“可观察行为”进行任何更改,并且所以它取而代之。但是,puts
并未包含NULL
的{{1}}检查代码,因此您会遇到分段错误。
C99,§7.19.6.1,¶8:
参数应该是指向字符类型数组的初始元素的指针。
¶9:
如果任何参数不是相应转换规范的正确类型,则行为未定义。
你属于最后一种情况,因为printf
不是“指向字符类型数组的初始元素的指针。