一 写在开头spa
1.1 本节内容code
分享一个刚刚调通的BUG的过程与结果。blog
二 排错过程与缘由分析索引
今天在写代码的过程当中发现了一个颇有意思的BUG,触发该BUG的缘由很简单,并且我以前也遇到过。看来这个BUG挺广泛的。首先,你们请看下面的这段代码。for循环
1 int GetDistance(int A[], int n) 2 { 3 int i, sum = 0; 4
5 sum += (A[n-1] - A[0]) * (A[n-1] - A[0]); 6 for (i = n - 2; i >= 0; i++) 7 sum += (A[i] - A[i + 1]) * (A[i] - A[i + 1]); 8 return sum; 9 }
这段代码看上去一点问题也没有,但实际上,它却引起了段错误!问题出在哪呢?很简单,这段代码使用的是逆序的方式枚举的,也就是索引i是从大变到小的。可是,由于在平时写的可能是顺序枚举,因此顺手将i--(自减)写成了i++(自增),因而程序奔溃了!class
怎么避免这个问题?没法避免!只能本身内心多根弦——逆序枚举,i--;顺序枚举,i++。具体到上述代码,只要把for循环中的i++改为i--就行了。循环
1 int GetDistance(int A[], int n) 2 { 3 int i, sum = 0; 4
5 sum += (A[n-1] - A[0]) * (A[n-1] - A[0]); 6 for (i = n - 2; i >= 0; i--) 7 sum += (A[i] - A[i + 1]) * (A[i] - A[i + 1]); 8 return sum; 9 }