printf %s情况下字符串为NULL的输出结果

遇到问题

1
2
printf("this%s\n", s);
printf("%s\n", s);

当s为NULL的时候,执行上面三个语句两个语句执行结果分别为:

1
2
this(null)
segment fault

问题分析

在ANSI C中没有对printf时字符串为NULL的情况进行明确的定义,所以当出现这种情况时往往是未定义行为。
所以上面第一种情况会出现segment fault的情况是一种未定义行为,可能在其他编译器上不会出现段错误。

上面出现段错误的行为我们可以通过反汇编进行查看。

反汇编的结果如下:

1
2
3
4
5
804842d: c7 04 24 20 85 04 08 movl $0x8048520,(%esp)
8048434: e8 0b ff ff ff call 8048344 <printf@plt>
8048439: c7 04 24 00 00 00 00 movl $0x0,(%esp)
8048440: e8 df fe ff ff call 8048324 <puts@plt>
8048445: 83 c4 14 add $0x14,%esp

从上面可以看出第一个执行被汇编成真正的printf指令,而第二个简单的printf NULL的指令被汇编成puts。
所以才出现了上面的结果。