今天看同事的代碼,入坑了。。。

二話不說,先貼代碼:

#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、跳出既定背景,多方位分析
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章