我发现printf有些奇怪。
当我执行以下操作时
printf ("%s\n", (char *)NULL);
我遇到了段错误。
但是当我这样做时:
printf (".%s\n", (char *)NULL);
输出低于且没有崩溃。
.(null)
有谁知道行为差异的原因?
答案 0 :(得分:0)
如果查看生成的汇编代码,您会看到printf ("%s\n",…)
已puts
调用printf
,而其他格式字符串则不适合此技巧。
碰巧在你的平台上,puts
函数检测到空指针并善意避免崩溃,而printf
函数则没有。
区别并不重要:将%s
的空指针传递给{{1}}是未定义的行为。不要做任何事,即使在你的特定编译平台上,你第二次幸运。