2014-03-29 58 views
0
char *p = NULL; 
printf("%s", p); 

为什么上述不会导致分段错误?但是为什么printf与 n会产生分段错误?

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

呢?

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

我在面试中被问及这个问题,我给出了与其未定义行为相同的答案,但他们的期望是给它的理由,我不知道我还能补充什么。对此有何想法?

+5

将NULL指针传递给'printf()'调用未定义的行为。你很幸运,在这两种情况下,行为**是不同的:你必须注意到它并问为什么。但除了未定义之外,没有任何理由。不要这样做。 – pmg

+1

引用无效内存是未定义的行为,它与'\ n'无关。 – Rohan

+2

传递一个NULL指针到'printf()'是好的。只是不要将它作为有效的字符串或其他字符来传递。说谎是皱眉,罚款是UB。 – Deduplicator

回答

5

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

故事的寓意是:不要调用未定义的行为;不要通过NULL - 指向printf的指针。

1

这两个示例都会调用UB,因为在提供(char*)0时,格式字符串会导致printf期望有效的字符串。

+0

那是正确的 printf(“\ n%s”,p);也在工作。 –

0

你自己给出了一个很好的未定义行为的例子。需要传递NULL指针到printf(),是否有人逼你? 正如其名称所暗示它是
The incorrect codes to which standard forces no requirements

It can even launch mesilles unwillingly if you have sufficient hardware
更从Kninnug回答指定的链接阅读行为。

+0

请提及原因的人。 – YakRangi

相关问题