二話不說,先貼代碼:
#include <stdio.h>
int main()
{
int i = 0;
unsigned int *tmp = NULL;
unsigned int ip[10];
tmp = ip;
for (i = 0; i < 10; i++)
{
tmp += i;
*tmp = i;
}
for (i = 0; i < 10; i++)
{
printf("ip[%d] : %d\n", i, ip[i]);
}
return 0;
}
這個小代碼,哪裏有問題?!!!
相信聰明的你,已經看出了端倪!
先貼出結果:
ip[0] : 0
ip[1] : 1
ip[2] : 0
ip[3] : 2
ip[4] : 0
ip[5] : 0
ip[6] : 3
ip[7] : 0
ip[8] : 1396902848
ip[9] : 32767
看這個你應該就知道了吧:循環賦值有問題:
for (i = 0; i < 10; i++)
{
tmp += i;
*tmp = i;
}
//初看這個代碼時,感覺沒有問題啊,每次循環加i,然後把值賦給*tmp!
//但是仔細分析下,就會發現漏洞:
//每次循環時,tmp在變,i也在變,所以這樣賦值是跳着賦值的。
其實單看這個代碼,很容易發現問題,但是在工程中,有其他業務邏輯的時候,往往懷疑是業務方面的問題,忽略了這樣的低級錯誤,導致浪費了不少時間!
所以遇到問題,一定要冷靜分析思考:
1、理清業務邏輯關係
2、添加調試信息,仔細分析調試數據
3、跳出既定背景,多方位分析