下面的C代码是否安全?
#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语句)标准是否兼容?
感谢您的帮助和耐心:)
问候
拉利
总之,是上述代码(没有 if语句)标准兼容?
号ISO/IEC 9899:1999(C标准文件)不作任何应该发生什么,如果ptr
是空的,所以行为是不确定声明。你使用的库仅仅是足够友好的给你一些有用的输出(“(null)”)而不是崩溃。
包括对NULL的显式检查。
在疑问,你不应该依赖于实现细节和执行额外的(ptr != NULL)
的情况下 - 这也是良好的编码习惯。
你的意思是这样的吗?
char* result = foo(); printf ("result is %s\n", (result ? result : "NULL"));
我喜欢这个,谢谢:) – ghayalcoder 2010-03-30 14:17:46
根据我的经验,虽然我倾向于避免做习惯说明中的事情,但通常情况下,您不需要if语句就可以清楚了......这已经很长时间了,但IIRC是我使用的Sun编译器如果你将一个NULL char *传递给printf(),那么在一些或者所有的时候都会导致崩溃,所以包含这个检查就更容易和更安全了......我将会抛出关于使用宏观形式,但我看到自从我开始输入以来,我在30秒内就被其他3人一直打败了。:)
什么是''头文件提供给您的代码?您的代码通过将空指针传递给不期望的函数来调用未定义的行为。任何事情都可能发生 - 主要包括可能无意中发生的事情。 –
2010-03-30 13:50:03
好吧,我明白了。谢谢大家对这样的“实时”帮助:)) – ghayalcoder 2010-03-30 14:17:02