【C语言】数据类型转换导致读取参数错误
来源:互联网 发布:淘宝卖家微淘入口 编辑:程序博客网 时间:2024/05/02 00:55
一个数据结构定义如下:
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参数将编译警告视作错误
0 0
- 【C语言】数据类型转换导致读取参数错误
- c语言数据类型不对导致的计算错误
- C语言数据类型转换
- C语言数据类型转换
- C语言数据类型转换
- C语言数据类型转换
- C语言数据类型转换
- c语言数据类型转换
- c语言,数据类型转换
- C语言数据类型转换
- C语言数据类型转换
- C语言中数据类型不一致导致安全性漏洞-memcpy()的参数 int 与 unsigned
- C语言数据类型转换详解
- C语言数据类型转换 - 图解
- c语言数据类型的转换
- 深入C语言数据类型转换
- C语言强制数据类型转换
- C语言数据类型的转换
- C++ 中的关键字explicit
- java面向对象编程学习日志【1】第一章
- New package not yet registered with the system 解决方法
- iOS学习之——GCD(Grand Central Dispatch)
- 遇到的问题(一)——editText软键盘不是自动弹出的吗,为什么宝宝的不弹?
- 【C语言】数据类型转换导致读取参数错误
- OpenLayers3加载Geojson文件
- Hibernate-----多条件查询,多对多添加查询案例
- 数据规整化:清理、转换、合并、重塑
- js动态获取页面高度
- Qt中的中信号槽与异步调用
- Python 通过Jpype调用Java类
- ReactNative图片
- 第12周课后实践(1)