char *p = NULL;
printf("%s", p);
为什么以上不会导致分段错误?但是
char *p = NULL;
printf("%s\n",p);
确实
要添加我知道它是以这种方式使用的未定义行为,但仍然想知道为什么它会产生6次中的6次使用\ n而不是没有它。
我在采访中被问到这个问题,我给出了相同的答案,因为它的未定义的行为,但他们的期望是给它理由,我不知道还能添加什么。有什么想法吗?
答案 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答案中指定的链接。