<分区>
我发现 printf 有一些奇怪的地方。
当我执行以下操作时
printf ("%s\n", (char *)NULL);
我遇到段错误。
但是当我这样做的时候:
printf (".%s\n", (char *)NULL);
输出如下,没有崩溃。
.(null)
有谁知道行为差异的原因?
标签 c
<分区>
我发现 printf 有一些奇怪的地方。
当我执行以下操作时
printf ("%s\n", (char *)NULL);
我遇到段错误。
但是当我这样做的时候:
printf (".%s\n", (char *)NULL);
输出如下,没有崩溃。
.(null)
有谁知道行为差异的原因?
最佳答案
如果您查看生成的汇编代码,您会看到 printf ("%s\n",…)
已经是 optimized by the compiler调用 puts
,而其他格式字符串不适合这种技巧。
碰巧在您的平台上,printf
函数检测空指针并善意避免崩溃,而 puts
函数则没有。
区别并不重要:将空指针传递给 %s
的 printf
是未定义的行为。永远不要这样做,即使在您的特定编译平台上,您第二次很幸运。
关于c - 带有 NULL 指针的基本 printf 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36138173/