c - 带有 NULL 指针的基本 printf 行为

标签 c

<分区>

我发现 printf 有一些奇怪的地方。

当我执行以下操作时

printf ("%s\n", (char *)NULL);

我遇到段错误。

但是当我这样做的时候:

printf (".%s\n", (char *)NULL);

输出如下,没有崩溃。

.(null)

有谁知道行为差异的原因?

最佳答案

如果您查看生成的汇编代码,您会看到 printf ("%s\n",…) 已经是 optimized by the compiler调用 puts,而其他格式字符串不适合这种技巧。

碰巧在您的平台上,printf 函数检测空指针并善意避免崩溃,而 puts 函数则没有。

区别并不重要:将空指针传递给 %sprintf 是未定义的行为。永远不要这样做,即使在您的特定编译平台上,您第二次很幸运。

关于c - 带有 NULL 指针的基本 printf 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36138173/

相关文章:

c - scanf无法读取C中字符串后的 float 据?

C 将 Short Int 转换为 Unsigned Short

c++ - 有没有办法为 NUMA 中的数据分配特定的内存?

c - 使用 scanf() 读取的字符串大小不超过字符串的大小

c - 将变量设置为 0 时出现段错误

c - 通过引用将结构体成员传递给函数

c - 为什么我的 float 打印为 0,即使我使用 scanf 为它输入 13.5?

c++ - 如何检查 HANDLE 是否有效?

c++ - 为什么 -INT_MIN = INT_MIN 以带符号的二进制补码表示?

c - 如何阻止来自计算机端口 23 的数据包?