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

noM*_*MAD 8 c segmentation-fault

在下面的:

printf("Example%s\n",NULL);
printf("%s\n",NULL);
Run Code Online (Sandbox Code Playgroud)

我得到的输出为:

Example(null)
Segmentation Fault
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,我发现这篇文章但似乎仍然没有意义.

Mat*_*lia 15

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

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

在第二种情况下,优化器理解您printf可以替换为puts(更高效),而不会对程序的"可观察行为"进行任何更改,因此它将替换它.但是,puts不会发生包含NULL-checking代码的情况printf,因此会出现分段错误.


  1. C99,§7.19.6.1,8:

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

    9:

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

    你属于这最后一种情况,因为NULL它不是"指向字符类型数组的初始元素的指针.