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

时间:2014-03-29 15:19:25

标签: c segmentation-fault

char *p = NULL;
printf("%s", p); 

为什么以上不会导致分段错误?但是

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

确实

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

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

3 个答案:

答案 0 :(得分:5)

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

故事的寓意是:不要调用未定义的行为;请勿将NULL - 指针传递给printf

答案 1 :(得分:1)

您的示例都会调用UB,因为格式字符串会导致printf期望有效的字符串,而您提供(char*)0

答案 2 :(得分:0)

你自己给出了一个未定义的行为的优秀例子。需要将NULL指针传递给printf(),有人强迫你吗? 顾名思义,这是行为 The incorrect codes to which standard forces no requirements

It can even launch mesilles unwillingly if you have sufficient hardware
阅读Kninnug答案中指定的链接。