vickytong1018的博客

记录人生点滴

【C语言】数据类型转换导致读取参数错误
一个数据结构定义如下:
typedef struct {
int enabled;
unsigned char type;
int size;
unsigned char name[8]
} MY_STRUCT;
然后定义一函数接口,本意是对MY_STRUCT中的int类型和string进行读取,这里函数接口的作者忽视了unsigned char,视为int类型
_get_my_struct_data(MY_STRUCT *pData, char *pName, int *cfgEntry )
{
     ...
      *cfgEntry = pData->type;
     ...
}

然后调用:
MY_STRUCT cfg;
_get_my_struct_data(&initCfg, "type", &cfg.type ); /*initCfg是一个全局的变量,initCfg.type = 1,这个并不是关键,关键是第三个参数&cfg.type*/
printf(" cfg.type = %d\r\n",  cfg.type); 发现值为0,而不是1;
为什么?
首先说明的 是这代码在大端字节顺序的cpu上运行,第三个参数&cfg.type的地址原来是一个unsigned char类型,而到了函数内部变成了int类型,假设这个地址是a,那么在函数内部,由于大端字节顺序,数据高位置,放在内存低处,
所以内存分布如下:
+++++++++++++++++++
|  a   | a+1 |a+2|  a+3  |
+++++++++++++++++++
赋值*cfgEntry = pData->type;只对a+3  写入数值1,其他的还是0;而函数返回后打印是unsigned char类型,只是地址a的值,该数值是0;

如何避免这种不细心的函数参数类型强制变化导致的错误,第一,在函数接口定义和使用的时候要严格按照类型进行,第二,不要忽视编译过程的警告
warning: passing argument 3 of '_get_my_struct_data' from incompatible pointer type
或者在编译中使用Werror参数将编译警告视作错误
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vickytong1018/article/details/51545572
个人分类: C语言
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

【C语言】数据类型转换导致读取参数错误

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭