C 打印带有或不带有换行符的空字符指针时的不同输出

C 打印带有或不带有换行符的空字符指针时的不同输出,c,pointers,C,Pointers,我在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; } #包括 int main() { char*p=NULL; printf(“%s”,p); 返回

我在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;
}
#包括
int main()
{
char*p=NULL;
printf(“%s”,p);
返回0;
}
#包括
int main()
{
char*p=NULL;
printf(“%s\n”,p);
返回0;
}
第一个输出:
(null)

而第二个会导致分段错误


为什么
\n
会产生如此大的差异?

根据标准,您的两个示例都是未定义的行为。使用
%s
调用
printf
并传递空指针是错误的

因此,讨论结果毫无意义。在一个系统上你可能会得到一个结果,在另一个系统上你会得到另一个结果


另请参见

Hmm,我也希望出现一个
(null)
,但我也得到了segfault。将
\n
替换为其他内容,如
printf(“%su”,p)
打印
(null)u
。即使在
\n
之前添加空格也会打印
“(空)”
。现在我很好奇,两者都没有定义behavior@Pablo不管你得到什么结果。代码是UB,可能会给出任何结果。@Pablo标记为该链接的副本,如果您认为它更合适的话。@4386427我不知道这是UB,使用gcc我一直看到在将
null
传递给
%s
时打印
,所以我认为这是正常行为。现在我更清楚了。