2010-03-30 69 views
11
#include<cstdio> 
#include<stdlib.h> 

int main() 
{ 
    char* ptr=NULL; 
    printf("%s",ptr); 
    return 0; 
} 

它将输出(null)作为输出。 以上是示例代码。在实际代码中,我将char *作为函数的返回值,我希望打印字符串以进行日志记录。但是,NULL也是该函数的有效返回值,所以我想知道在打印字符串之前是否需要空检查?下面的C代码是否安全?

char* ptr=someFuncion(); 
// do i need the following if statement? 
if(ptr!=NULL) 
{ 
    printf("%s",ptr); 
} 

我只是想确保输出将是相同的,即若ptr = NULL,则输出应为(空)的所有平台和编译器和上面的代码(不if语句)不会对任何崩溃C标准兼容平台。

总之,上面的代码(没有if语句)标准是否兼容?

感谢您的帮助和耐心:)

问候

拉利

+0

什么是''头文件提供给您的代码?您的代码通过将空指针传递给不期望的函数来调用未定义的行为。任何事情都可能发生 - 主要包括可能无意中发生的事情。 – 2010-03-30 13:50:03

+0

好吧,我明白了。谢谢大家对这样的“实时”帮助:)) – ghayalcoder 2010-03-30 14:17:02

回答

21

总之,是上述代码(没有 if语句)标准兼容?

号ISO/IEC 9899:1999(C标准文件)不作任何应该发生什么,如果ptr是空的,所以行为是不确定声明。你使用的库仅仅是足够友好的给你一些有用的输出(“(null)”)而不是崩溃。

包括对NULL的显式检查。

5

在疑问,你不应该依赖于实现细节和执行额外的(ptr != NULL)的情况下 - 这也是良好的编码习惯。

7

你的意思是这样的吗?

 
    char* result = foo(); 
    printf ("result is %s\n", (result ? result : "NULL")); 
+0

我喜欢这个,谢谢:) – ghayalcoder 2010-03-30 14:17:46

1

根据我的经验,虽然我倾向于避免做习惯说明中的事情,但通常情况下,您不需要if语句就可以清楚了......这已经很长时间了,但IIRC是我使用的Sun编译器如果你将一个NULL char *传递给printf(),那么在一些或者所有的时候都会导致崩溃,所以包含这个检查就更容易和更安全了......我将会抛出关于使用宏观形式,但我看到自从我开始输入以来,我在30秒内就被其他3人一直打败了。:)