尝试打印NULL时有两种情况,其中一种是其他SegFaults

时间:2012-04-10 21:09:15

标签: c segmentation-fault

以下内容:

printf("Example%s\n",NULL);
printf("%s\n",NULL);

我得到的输出为:

Example(null)
Segmentation Fault

当我在GDB中尝试回溯时,显示printf()转换为puts()。但我似乎无法理解为什么会这样。

BTW我发现了this文章,但似乎仍然没有意义。

1 个答案:

答案 0 :(得分:15)

标准说将NULL指针作为参数传递给printf %s说明符是未定义的行为 1 (即任何事情都可能发生),所以这两种行为都是合法的。

在第一种情况下,标准库(特别是printf代码)通过打印(null)为您提供帮助。

在第二种情况下,优化程序会理解您的printf可以替换为puts(效率更高),而不会对程序的“可观察行为”进行任何更改,并且所以它取而代之。但是,puts并未包含NULL的{​​{1}}检查代码,因此您会遇到分段错误。


  1. C99,§7.19.6.1,¶8:

      

    参数应该是指向字符类型数组的初始元素的指针。

    ¶9:

      

    如果任何参数不是相应转换规范的正确类型,则行为未定义。

    你属于最后一种情况,因为printf不是“指向字符类型数组的初始元素的指针。