码迷,mamicode.com
首页 > 其他好文 > 详细

函数的指针参数强制类型转换异常

时间:2018-02-07 14:41:02      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:int   擦除   sig   编译器   函数参数   har   赋值   导致   类型转换   

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. 工作总结,意识的改变,以前只想着我给老板打工,老板付我薪水,但是最近觉的,我想要做出优秀的产品,就像苹果手机一样,做到最好,让客户认可我们,做出优秀的产品才能证明我是个优秀的人。这是一次思想的转变。我开始注意工作的细节,如果产品做的不好,我会指出来,要求改掉,我以前不会这样的。以前只觉得,恩,做出来就可以了,算是完成任务,从来没想过这个产品做的好不好,市场是否需要。这个产品还能不能做的更好。

 

函数的指针参数强制类型转换异常

标签:int   擦除   sig   编译器   函数参数   har   赋值   导致   类型转换   

原文地址:https://www.cnblogs.com/429512065qhq/p/8425787.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!