函數的指針參數強制類型轉換異常


1. 本次遇到一個問題,首先看如下代碼,unsigned char len取其地址作為函數的指針參數傳遞給get_imsi這個函數,其中第二個函數參數是uint16 *指針類型,但是實際傳遞的是uint8 *,然后程序運行的時候,直接異常跑飛。

uint8    cissys_getIMSI(uint8* buffer,uint32_t maxlen)
{
    UNUSED(maxlen);
    uint8 len = 0;
    char     puc_imsi[NBSYS_IMEI_MAXLENGTH]     = {0};
    uint16   uc_len        = 0;
    uint16   uc_loop;
    get_imsi((char *)puc_imsi,(uint16 *)&len);
    for (uc_loop = 0;uc_loop < len; uc_loop++)
    {
            uc_len += (uint16)sprintf((char *)(buffer + uc_len), "%u", puc_imsi[uc_loop]);
    }
    return len;
}

2. 修改后的代碼

uint8    cissys_getIMSI(uint8* buffer,uint32_t maxlen)
{
    UNUSED(maxlen);
    uint8 len = 0;
    uint16 len = 0;
    char     puc_imsi[NBSYS_IMEI_MAXLENGTH]     = {0};
    uint16   uc_len        = 0;
    uint16   uc_loop;
    get_imsi((char *)puc_imsi,(uint16 *)&len);
    for (uc_loop = 0;uc_loop < len; uc_loop++)
    {
            uc_len += (uint16)sprintf((char *)(buffer + uc_len), "%u", puc_imsi[uc_loop]);
    }
    return len;
}

3. 這個問題的關鍵在於,從來沒引起我的注意,在函數參數是uint16指針,但是實際是uint8的取地址,引起這個異常的原因會是什么?首先len是在棧里面(一個字節),給其uint16(2個字節),分兩種情況,第一直接賦值,那么應該不會有問題(編譯器強制類型轉換,取2個字節的低字節賦值給len,所以只修改1個字節),第二種,指針引用賦值,由於是直接操作地址,所以會擦除2個字節,導致異常。雖然是個很小的問題,但是很重要。

4. 工作總結,意識的改變,以前只想着我給老板打工,老板付我薪水,但是最近覺的,我想要做出優秀的產品,就像蘋果手機一樣,做到最好,讓客戶認可我們,做出優秀的產品才能證明我是個優秀的人。這是一次思想的轉變。我開始注意工作的細節,如果產品做的不好,我會指出來,要求改掉,我以前不會這樣的。以前只覺得,恩,做出來就可以了,算是完成任務,從來沒想過這個產品做的好不好,市場是否需要。這個產品還能不能做的更好。

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com