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

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个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

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