指针参数是不是都必须做NULL判断?

HeBanBei 2015-09-25 10:38:11
如果一个函数的参数存在指针类型,那么在函数体中是不是就必须先判断这个参数是否为NULL?
如果不在函数体中作判断,而是只由调用函数的模块来作保证,是不是就是不好的代码?


int fun(int * arg)
{
if(arg==NULL) {
return -1;
}

// do something
}
...全文
2240 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2015-09-28
  • 打赏
  • 举报
回复
如果是内部代码,那么使用一个断言就可以l。 如果是导出的函数,那么一定要判断。你不能假定调用者de调用习惯。 如果,你确实不允许使用 NULL,那么调试版中需要加入断言 ,让使用者及早发现。 至于 发布版需不需要判断,看文档的说明。 最著名的就是 sqrt 函数中的参数是否大于等于 0 的判断。 调试版本中是有断言的,而发布版就是假定参数是 >=0 的。
HeBanBei 2015-09-28
  • 打赏
  • 举报
回复
引用 10 楼 jiqiang01234 的回复:
如果是自己的函数,判断指针为NULL的意义不大,更好的是直接用assert(p!=NULL),而不是仅仅检查一下参数为空就返回。一般来说,参数为空,意味着调用端出了问题,不应该就这么轻易放过。如果仅仅是返回值代表错误,但调用者又没有检查返回值,这就更有问题。
我明白你的意思。你的意思是既然传入的参数是错误的,就应该在调用时避免。 但是使用assert()会有一个问题。它影响程序性能。 所以assert()一般只在调试时启用。在交付使用时禁用。 那么交付使用时,如果意外发生。也就是在程序员未知的情况下传入NULL,那么程序就漰溃了而没有任何日志信息。这样不利于排查问题。
lkjasdf9909 2015-09-28
  • 打赏
  • 举报
回复
是啊,有道理


void close_file(FILE *fp){
	if(fp!=NULL){
		....
	}
}

void open_file(FILE *fp){
	if(fp==NULL){
		close_file(fp);
		//打开文件。。。
	}
}

赵4老师 2015-09-28
  • 打赏
  • 举报
回复
别人给你的钱是不是都必须辨别真伪?
赵4老师 2015-09-25
  • 打赏
  • 举报
回复
多判断几次是极好的。
alongman2012 2015-09-25
  • 打赏
  • 举报
回复
最好是在函数体中做判断,模块化思维。
HeBanBei 2015-09-25
  • 打赏
  • 举报
回复
引用 6 楼 hlx_beat 的回复:
错了 一定要判断是否为空,而是释放之后一定要置空
你是不是打错字了? 你想说的意思是: 1、函数体中对指针参数必须判断是否为空。 2、如果指针指向的是堆内存,并且已被释放,那么这个指针就必须赋值为NULL 对吗?
hlx_beat 2015-09-25
  • 打赏
  • 举报
回复
错了 一定要判断是否为空,而是释放之后一定要置空
HeBanBei 2015-09-25
  • 打赏
  • 举报
回复
引用 3 楼 zxh707wk 的回复:
就算在函数体内判断是否为NULL,调用该函数时也需要判断函数返回值
如果调用时参保证传递过去的参数不为NULL,那就不需要对返回值作判 断吧。
xian_wwq 2015-09-25
  • 打赏
  • 举报
回复
引用 2 楼 HeBanBei 的回复:
[quote=引用 1 楼 xian_wwq 的回复:] 这是一种预防性的处理, 保证当指针为空时不会引发崩溃。 因为函数有可能被其他人调用, 可能没有进行完整的初始化。
如果代码全是我自己写的。函数只被 我自己调用。那么不做判断是不是也属于不好的代码?[/quote] 是的,这是个好习惯,可以规避掉很多问题 所有的指针参数,返回指针都需要判断,否则就等着崩溃吧
707wk 2015-09-25
  • 打赏
  • 举报
回复
就算在函数体内判断是否为NULL,调用该函数时也需要判断函数返回值
HeBanBei 2015-09-25
  • 打赏
  • 举报
回复
引用 1 楼 xian_wwq 的回复:
这是一种预防性的处理, 保证当指针为空时不会引发崩溃。 因为函数有可能被其他人调用, 可能没有进行完整的初始化。
如果代码全是我自己写的。函数只被 我自己调用。那么不做判断是不是也属于不好的代码?
xian_wwq 2015-09-25
  • 打赏
  • 举报
回复
这是一种预防性的处理, 保证当指针为空时不会引发崩溃。 因为函数有可能被其他人调用, 可能没有进行完整的初始化。
707wk 2015-09-25
  • 打赏
  • 举报
回复
引用 4 楼 HeBanBei 的回复:
[quote=引用 3 楼 zxh707wk 的回复:] 就算在函数体内判断是否为NULL,调用该函数时也需要判断函数返回值
如果调用时参保证传递过去的参数不为NULL,那就不需要对返回值作判 断吧。[/quote]你能绝对保证这代码不会被其他人调用而传入NULL?
牧野狂少 2015-09-25
  • 打赏
  • 举报
回复
如果程序比较大,你能保证你每个指针都释放,清空了么?这样判断多了一重保险,是个好习惯。
jiqiang01234 2015-09-25
  • 打赏
  • 举报
回复
如果是自己的函数,判断指针为NULL的意义不大,更好的是直接用assert(p!=NULL),而不是仅仅检查一下参数为空就返回。一般来说,参数为空,意味着调用端出了问题,不应该就这么轻易放过。如果仅仅是返回值代表错误,但调用者又没有检查返回值,这就更有问题。

70,027

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧