【问题标题】:Different output when printing a null char pointer with and without a newline appended [duplicate]打印带有和不带有换行符的空字符指针时的不同输出[重复]
【发布时间】:2026-02-10 16:35:01
【问题描述】:

我在 Linux 上尝试了以下代码

#include<stdio.h>
int main()
{
    char *p=NULL;
    printf("%s",p);
    return 0;
}

#include<stdio.h>
int main()
{
    char *p=NULL;
    printf("%s\n",p);
    return 0;
}

第一个输出:(null)

而第二个导致分段错误。

为什么\n 会产生如此大的影响?

【问题讨论】:

  • 嗯,我也期待(null),但我也得到了段错误。将\n 替换为其他内容,例如printf("%su", p) 打印(null)u。即使在\n 之前添加一个空格,也会打印"(null) "。现在我很好奇。
  • 两者都是未定义的行为
  • @Pablo 你得到什么结果并不重要。代码是 UB,可能会给出任何结果。
  • @Pablo 如果您认为该链接更合适,请将其标记为重复。
  • @4386427 我不认为这是 UB,使用 gcc 我总是看到 (null) 在将 NULL 传递给 %s 时被打印,所以我认为这是正常行为。现在我知道得更多了。

标签: c pointers


【解决方案1】:

您的两个示例都是未定义的标准行为。用%s 调用printf 并传递一个NULL 指针是UB。

因此,讨论结果是没有意义的。在一个系统上你可能会得到一个结果,而在另一个系统上你会得到另一个结果。

另见https://*.com/a/11589479/4386427

【讨论】:

    最近更新 更多