提出问题
printf(“%s\n”, (char)NULL)
跟
printf(“%s”, (char)NULL);
fflush(stdout);
有什么区别?
为什么前者会导致Segmentation fault
后者打印(null)
分析问题
首先,源文件:
|
|
在此你应该可以发现,少了一句fflush(stdout),这句是刷新输出流的意思,大多数情况下,main函数结束后会自动刷新输出流,加上这个函数语句简单,所以有无fflush区别不大
|
|
编译时,附加-save-temps选项来查看汇编代码(8.c是源文件名):
gcc -c 8.c -save-temps —> 会产生一个8.s的包含汇编代码的文件
gcc 8.o -o 8
./8
汇编代码:
这是”%s”的:
这是”%s\n”的:
可以发现,
“%s”这个是调用了printf函数进行处理,printf把这个当成了一种情况来处理,识别到这是一个NULL指针,
而”%s\n”这个则是直接调用了puts函数来进行输出,而puts函数对于NULL指针并没有作判断处理,所以才会引发Segmentation fault。
以下是原答案地址:
- What is the behavior of printing NULL with printf’s %s specifier?
- What is the behavior of printing NULL with printf’s %s specifier?
参考侵权告删