你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

goto——C语言的一部分

[复制链接]
gaosmile 发布时间:2020-9-25 12:12
很多书籍都会把“”goto“”当成反面教材使用,认为如果使用不当,将会造成很多意想不到的问题。但goto作为C语言的一部分,存在即合理,goto有它的缺点,也有它的优点。缺点:
很容易把逻辑弄乱,增加理解难度,goto是可以实现无条件跳转的,一旦跳转,就忽略很前面很多代码,特别是在一些逻辑复杂的地方使用,会很容易出问题。所以goto能不用就不用,特别对于新手,尽量避讳。

优点:
方便处理异常情况,特别是内存等系统资源的释放。很多大型项目,开源项目,包括Linux内核,都会使用goto来处理异常情况。
举个例子,以下情况,大家第一反应是没有问题,其实是存在内存泄漏隐患的。如果变量pdate2申请失败,则退出函数。那么问题来了, pdate 申请成功了,但没有得到释放,出现了内存泄漏。所以这种情况如果使用goto,就很容易解决问题。

  1. int module_init()
  2. {
  3.   char *pdate = (char *)malloc(100);
  4.   if(pdate == NULL)
  5.     return -1;

  6.   char *pdate2 = (char *)malloc(100);
  7.   if(pdate2 == NULL)
  8.     return -1;

  9.   free(pdate);
  10.   free(pdate2);
  11.   ......
  12. }
复制代码

goto实现代码


  1. int module_init()
  2. {
  3.   char *pdate = (char *)malloc(100);
  4.   if(pdate == NULL)
  5.     goto err;

  6.   char *pdate2 = (char *)malloc(100);
  7.   if(pdate2 == NULL)
  8.     goto err;

  9.   free(pdate);
  10.   free(pdate2);
  11.   ......

  12. err://统一的出错处理
  13.   if(pdate != NULL)
  14.     free(pdate);
  15.   if(pdate2!= NULL)
  16.     free(pdate2);
  17.   return -1;
  18. }
复制代码


另一种写法就是分阶段处理:

  1. if(pdate == NULL)
  2.     goto err1;
  3.     ...
  4.   if(pdate2 == NULL)
  5.     goto err2;
  6.     ...
  7. err1:
  8.    free(pdate);
  9. err2:
  10.    free(pdate2);
  11.   ...
复制代码

总结:存在即合理,好坏取决于如何使用。


收藏 评论0 发布时间:2020-9-25 12:12

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版