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