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

goto——C语言的一部分

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

: {/ Y3 b8 ?1 [5 ]' b& e% _1 S优点:
" w2 b% \5 S. |3 u方便处理异常情况,特别是内存等系统资源的释放。很多大型项目,开源项目,包括Linux内核,都会使用goto来处理异常情况。
举个例子,以下情况,大家第一反应是没有问题,其实是存在内存泄漏隐患的。如果变量pdate2申请失败,则退出函数。那么问题来了, pdate 申请成功了,但没有得到释放,出现了内存泄漏。所以这种情况如果使用goto,就很容易解决问题。
  1. % q0 ^; C: c6 y! n* O* j7 B
  2. int module_init()8 _8 o4 ]8 Z( q# m& r
  3. {
    $ x5 Y$ R6 {$ U- D! W; g
  4.   char *pdate = (char *)malloc(100);
    . n+ W. j* b2 Y4 l4 f  Y# a6 S- p0 `
  5.   if(pdate == NULL)5 \0 {0 b4 X4 P1 ~4 u& J9 }
  6.     return -1;
    4 T7 W/ K/ @8 f5 R. F/ `" g+ d* p6 i
  7. ' C8 W) H4 g- T- P& C: d
  8.   char *pdate2 = (char *)malloc(100);
    9 Y, J$ b# }6 ?, u4 G1 x
  9.   if(pdate2 == NULL): `) O+ X; h; S( O
  10.     return -1;
    : z  z, C! l! l
  11. 2 s& }( \. n* B% ?, _9 @& R% N
  12.   free(pdate);
    ! A  k0 f+ ~! E& H5 J* h( ~
  13.   free(pdate2);
    3 l( H' q  _) A: k* d$ l
  14.   ......3 M2 y/ i- ~( Q- y2 G
  15. }
复制代码

9 v& `. ?! ~  t. O2 o& N! j

goto实现代码

  1. 6 t2 c) n( i% ^' }9 L
  2. int module_init()1 ^: Q8 Y1 p0 f$ o, l$ \$ t% w
  3. {
    / h* x; f- s. `+ b, }
  4.   char *pdate = (char *)malloc(100);
    : \) l3 U  _8 V
  5.   if(pdate == NULL)! |  _8 [+ P0 g. |) s1 q" Z5 a
  6.     goto err;
    : L- F! s% c1 z: t

  7. 9 c0 a* s6 O2 J8 t
  8.   char *pdate2 = (char *)malloc(100);
    ' ^  k( h0 E+ _: G
  9.   if(pdate2 == NULL)
    + W3 _+ z: D$ P; J3 [, R
  10.     goto err;8 c$ ^8 j; M! f9 D1 k
  11. 8 Y5 u$ C/ }) Y/ Y$ |+ b
  12.   free(pdate);
    8 F7 ^# t' \+ \. |3 F9 s
  13.   free(pdate2);
    4 X% c( u' B5 @* `
  14.   ......
    0 r1 s2 Z; n2 z$ Y1 w

  15. & P+ i: ]0 J/ f7 |$ V2 B+ w6 g
  16. err://统一的出错处理* v8 q* |8 {3 C1 ]1 `& i
  17.   if(pdate != NULL)$ \; k5 h; x# Q: j
  18.     free(pdate);
    . w+ C  ?. u4 |% }4 F. ^
  19.   if(pdate2!= NULL)! u" E1 m7 n' {- C8 J) ?: F& B
  20.     free(pdate2);% F3 J" [& g# ~5 j4 ~6 r& C
  21.   return -1;$ u1 I5 `! {7 T2 i6 C% D" B& F, ]
  22. }
复制代码

  Q$ |' }. n6 i3 D5 s" z
: C& [* v# G  @+ d( A% v( E, y另一种写法就是分阶段处理:
3 x1 m0 n6 q( _( \6 G
  1. 3 k$ d0 c& U% J. O8 g
  2. if(pdate == NULL)% r% e; P' z7 [, \/ h9 j
  3.     goto err1;
    ! K7 B9 j# P: H* W+ l" Y7 v( `2 D) J
  4.     ...% N0 b' B$ T$ ?! S6 f' M
  5.   if(pdate2 == NULL)5 q  D8 ~- u  u! M1 P9 S
  6.     goto err2;. {; E$ E# F% x2 A/ U- Y! \
  7.     ...
    ( |& Z( i4 L' |7 r
  8. err1:; o* w" D: j( Y, B# Z. e, B1 p
  9.    free(pdate);+ r! \$ L3 {( U2 E4 v& b
  10. err2:
    ( `% Z9 k3 M! ^" S
  11.    free(pdate2);
    : |2 }$ C5 h+ j9 m3 W$ N. D' L
  12.   ...
复制代码

$ Y1 M6 o, B# X4 ^1 P3 A
总结:存在即合理,好坏取决于如何使用。

9 T3 H" F3 L$ c- _: w% S5 |6 S6 m3 M; }1 p/ F5 B5 b
赞 收藏 评论0 发布时间:2020-9-25 12:12

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版