zoukankan      html  css  js  c++  java
  • 函数的指针参数强制类型转换异常

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

  • 相关阅读:
    day01--计算机硬件基础笔记
    22 Jun 18 Django,ORM
    21 Jun 18 Django,ORM
    20 Jun 18 复习, mysql
    20 Jun 18 Django,ORM
    19 Jun 18 复习, 正则表达式
    19 Jun 18 Django
    15 Jun 18 复习, shutil模块
    15 Jun 18 Django
    14 Jun 18 复习, form表单
  • 原文地址:https://www.cnblogs.com/429512065qhq/p/8425787.html
Copyright © 2011-2022 走看看