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

  • 相关阅读:
    项目开发日志——第三篇
    项目开发日志——第二篇
    项目开发日志——第一篇
    实时控制软件设计第四周作业
    实时控制软件设计第三周作业
    实时控制软件设计第二周作业
    关于开放式CNC系统实时软件控制系统的一些简单分析
    初学者的卡尔曼滤波——扩展卡尔曼滤波(一)
    C++_Eigen函数库用法笔记——The Array class and Coefficient-wise operations
    C++_Eigen函数库用法笔记——Block Operations
  • 原文地址:https://www.cnblogs.com/429512065qhq/p/8425787.html
Copyright © 2011-2022 走看看