char *p = NULL;
printf("%s", p);
为什么上述不会导致分段错误?但是为什么printf与 n会产生分段错误?
char *p = NULL;
printf("%s\n",p);
呢?
要添加我知道它是未定义的行为,以这种方式使用,但仍然想知道为什么它会产生6次使用\ n的分割错误6,而不是没有它。
我在面试中被问及这个问题,我给出了与其未定义行为相同的答案,但他们的期望是给它的理由,我不知道我还能补充什么。对此有何想法?
char *p = NULL;
printf("%s", p);
为什么上述不会导致分段错误?但是为什么printf与 n会产生分段错误?
char *p = NULL;
printf("%s\n",p);
呢?
要添加我知道它是未定义的行为,以这种方式使用,但仍然想知道为什么它会产生6次使用\ n的分割错误6,而不是没有它。
我在面试中被问及这个问题,我给出了与其未定义行为相同的答案,但他们的期望是给它的理由,我不知道我还能补充什么。对此有何想法?
undefined behaviour的一个很好的例子。您正在传递一个NULL
- 指向printf
的指针,期望指向指向null
终止字符缓冲区的指针,该缓冲区的行为未定义。这意味着只有机器中的妖精知道会发生什么。有时它似乎有效,有时它不会,有时它会产生错误,有时它会崩溃。
故事的寓意是:不要调用未定义的行为;不要通过NULL
- 指向printf
的指针。
你自己给出了一个很好的未定义行为的例子。需要传递NULL指针到printf(),是否有人逼你? 正如其名称所暗示它是
The incorrect codes to which standard forces no requirements
It can even launch mesilles unwillingly if you have sufficient hardware
更从Kninnug回答指定的链接阅读行为。
请提及原因的人。 – YakRangi
将NULL指针传递给'printf()'调用未定义的行为。你很幸运,在这两种情况下,行为**是不同的:你必须注意到它并问为什么。但除了未定义之外,没有任何理由。不要这样做。 – pmg
引用无效内存是未定义的行为,它与'\ n'无关。 – Rohan
传递一个NULL指针到'printf()'是好的。只是不要将它作为有效的字符串或其他字符来传递。说谎是皱眉,罚款是UB。 – Deduplicator