2014-09-25 95 views
-2

我在我的linux系统上运行了以下测试。为什么printf失败的空字符串?

试验1:

printf("test %s\n", NULL); 
printf("test %s\n", NULL); 

打印:

test (null) 
test (null) 

试验2:

printf("%s\n", NULL); 
printf("%s\n", NULL); 

打印

Segmentation fault (core dumped) 

上述测试有什么区别?为什么在上面的测试1中不会引发分段错误?

我无法理解为什么在第二次测试中打印失败?

+1

它是未定义的行为,您不能保证看到一致的结果。 – 2014-09-25 22:53:55

回答

2

在编译器中启用警告。你不打印你的想法。

我的编译器会很高兴地告诉你,(在这两种情况下):

warning: reading through null pointer (argument 2) [-Wformat] 
warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘void *’ [-Wformat] 

由于红色警戒说,ALERT!你做什么,是不确定的行为。

此外,请务必检查链接的answer以获得更详细的答案,它与我的距离不远。

+0

@卡迪娜,我看到你有-2,而我发布的链接答案有+8。我认为这是因为,已经有一个答案,但你没有找到。我会为你+1平衡,但要确保你下次更好地搜索。 :) – gsamaras 2014-09-25 23:02:02

+0

谢谢萨马拉斯。 – kadina 2014-09-25 23:03:58

相关问题