区别是:printf(“%s”, NULL)这个是调用了printf函数进行处理,printf把这个当成了一种情况来处理,识别到这是一个NULL指针。而printf(“%s”, NULL)则是直接调用了puts函数来进行输出,对于NULL指针并没有作判断处理,所以才会引发Segmentation fault。
printf(“%s”, NULL)这个是调用了printf函数进行处理,printf把这个当成了一种情况来处理,识别到这是一个NULL指针。而printf(“%s”, NULL)则是直接调用了puts函数来进行输出,对于NULL指针并没有作判断处理,所以才会引发Segmentation fault。
无论 C / C++,都要求 printf 的 %s 对应一个有效的指向字符数组的指针。如果提供的参数与要求不服,则对应的行为未定义。
If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.
所以 printf 考虑了 %s 的参数是 NULL 的情况吗?没有,标准只规定其行为未定义。
无论格式化字符串写成什么样子,只要你为其中的 %s 对应一个 NULL,打印「(null)」、打印「你这个笨蛋」、段错误、删除磁盘上所有文件、帮你叫个外卖……都是合理合法的 C / C++ 程序的行为。
延伸阅读:
什么是printf?
printf 是指格式化输出函数,主要功能是向标准输出设备按规定格式输出信息。printf 是C语言标准库函数,定义于头文件 <stdio.h>。printf 函数的一般调用格式为:printf(“<格式化字符串>”, <参量表>)。输出的字符串除了可以是字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义。
文章标题:printf(“%s”, NULL) 和 printf(“%s\n”, NULL) 的区别,发布者:小编,转载请注明出处:https://worktile.com/kb/p/38587