为什么带有\n的printf会产生分段错误?

bha*_*vin 0 c segmentation-fault

char *p = NULL;
printf("%s", p); 
Run Code Online (Sandbox Code Playgroud)

为什么上面没有导致分段错误?但

char *p = NULL;
printf("%s\n",p); 
Run Code Online (Sandbox Code Playgroud)

呢?

添加我知道它是以这种方式使用的未定义行为,但仍然想知道为什么它用\n生成6次中的6次,而不是没有它.

我在面试中被问到这个问题,我给出了相同的答案,因为它的未定义的行为,但他们的期望是给出理由,我不知道还能添加什么.有什么想法吗?

Kni*_*nug 5

未定义行为的一个很好的例子.您正在将NULL-pointer 传递给printf它期望指向一个null终止字符缓冲区的指针,其行为未定义.这意味着只有机器中的地精知道会发生什么.有时似乎工作,有时它不工作,有时它会给出错误,有时它会崩溃.

故事的寓意是:不要调用未定义的行为; 不要传递NULL-pointer printf.