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,因此会出现分段错误.
C99,§7.19.6.1,8:
参数应该是指向字符类型数组的初始元素的指针.
9:
如果任何参数不是相应转换规范的正确类型,则行为未定义.
你属于这最后一种情况,因为NULL它不是"指向字符类型数组的初始元素的指针.