原则上讲,为了代码的结构及易于维护性,通常被告知尽量少在代码中使用goto、递归等影响代码结构的代码。
可是,有时候用递归函数的思想确实可以使问题的思路非常清晰。
由于工作中要解决vlan用户态解析portlist的bug,原来解析portlist的函数看的着实令人头晕,
且有很多较常规的输入形式还会导致挂死的情况,于是开始了重写解析VLAN的以太网端口portlist函数之路。
如"1/1,2-3,5,7-9",感觉开始用指针指向斜杠后边的1,然后分情况来解析字符,并把已经解析的端口赋值给外部数组,
解析一次顺势向后指向对应的位置。如,把1解析之后存入数组后,指针指向2,继续递归调用该函数,之后指针指向5,在递归调用该递归函数。
上代码,需要修复指针越界访问的错误,
注意:
1、递归函数中的局部变量在每次调用函数时都会在栈中分配一份,借个图:
2、执行过程是到达结束点后再逐级逆着返回。
所以,编写递归函数时一定要给返回的条件,否则一直调用不到尽头,不知会不会耗尽内存??
3、较重要的一点,递归函数返回值是返回给谁调用我,然后再顺次往下执行,所以尽量不要在递归函数中使用多个if,
而每个if内都调用递归,一旦两个if都会被执行则会引起重入的混乱;所以,当是并列的多种情况时,
尽量使用if……elseif……elseif……else,,使递归函数只在一次调用中执行一次。
ps。上边的代码中,刚写时没有switch,没有if……elseif……elseif……else,
只是多个if 分支,分支内是执行与调用递归,然后用gdb调试才看出来混乱。
4、使用递归调试时,最好用gdb,否则痛苦死。。。
5、有时递归很耗系统资源,珍爱生命,慎用递归,不理解时调试更是累死人。。。