首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下面的C代码安全吗?

下面的C代码安全吗?
EN

Stack Overflow用户
提问于 2010-03-30 21:31:55
回答 3查看 340关注 0票数 11
代码语言:javascript
复制
#include<cstdio>
#include<stdlib.h>

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

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

代码语言:javascript
复制
char* ptr=someFuncion();
// do i need the following if statement?
if(ptr!=NULL)
{
  printf("%s",ptr);
}

我只想确保输出是相同的,即如果ptr=NULL,那么在所有平台和编译器上的输出应该是(null),并且上面的代码(没有if语句)在任何C标准兼容的平台上都不会崩溃。

简而言之,上面的代码(没有if语句)标准兼容吗?

感谢您的帮助和耐心:)

问候

拉利

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-30 21:36:28

简而言之,上面的代码(没有if语句)标准兼容吗?

不是的。ISO/IEC9899:1999(C标准文档)没有说明如果ptr为NULL会发生什么,所以行为是未定义的。您使用的库只是足够友好,可以为您提供一些有用的输出("(null)"),而不是崩溃。

包括对NULL的显式检查。

票数 21
EN

Stack Overflow用户

发布于 2010-03-30 21:35:11

如果有疑问,您不应该依赖于实现细节并执行额外的(ptr != NULL) -这也是很好的编码实践。

票数 5
EN

Stack Overflow用户

发布于 2010-03-30 21:37:57

在我的经验中,通常你不需要if-语句就可以做到这一点,尽管出于习惯,我倾向于避免做你所说明的事情……已经有很长一段时间了,但是IIRC我曾经使用过的Sun编译器在将NULL char*传递到printf()中时会导致某些或全部时间崩溃,所以将检查包含进来会更容易、更安全……我正要加入使用宏表单的注意事项,但我发现自从我开始键入以下内容以来,在30秒内就被其他3个人抢先一步:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2545553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档