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

原创 2016年05月31日 14:36:28
一个数据结构定义如下:
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参数将编译警告视作错误
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C语言数据类型转换的探讨

  • 2015年05月06日 13:51
  • 290KB
  • 下载

C语言中强制数据类型转换

字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128~127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围是0~255(有些机器把char...

c语言,数据类型转换

在执行算术运算时,计算机比C语言的限制更多。为了让计算机执行算术运算,通常要求操作数有相同的大小(即位的数量相同),并且要求存储的方式也相同。计算机可能可以直接将两个16位整数相加,但是不能直接将16...

整型正数与负数是如何在机器(以stm32为例)中存储与传递的--结合C语言的数据类型转换讲解

首先我来说一下我要讲清楚的问题是什么。这样对你好我也好,才是真的好,扯远了哈。问题是:我需要从一块stm32中的寄存器(下面我说A板)中读取一个 8位有符号整型数据,然后储存在另一块stm32的板子...

C语言中隐式数据类型转换的总结

参考:http://jls863.blog.163.com/blog/static/39014631200863102950742/ 示例: #include int main(void) {    ...
  • bytxl
  • bytxl
  • 2013年05月08日 22:38
  • 718

IEEE754浮点格式简述 和 C语言基本数据类型转换实质

本人菜鸟,花了点时间研究了一下C语言的数据转换现象(还没弄出深层原因呢)。不知道C编译器原理,而编译原理,汇编,组成原理只学点皮毛。 以下是成果,欢迎指正和释疑。  //编译环境:INTEL T3...

C语言中数据类型转换详解

3. 类型转换 如果有人问C语法规则中最复杂的是哪一部分,我一定会说是类型转换。从上面两节可以看出,有符号、无符号整数和浮点数加起来有那么多种类型,每两种类型之间都要定义一个转换规则,转...

深入C语言数据类型转换

我想,大家都常常听人提及,C语言指针的重要性吧,但它重要在哪儿,你们有想过吗? 我们来看一个简单的例子: int i = 256; char *a = (char *)&i; printf("...
  • abcdcb
  • abcdcb
  • 2012年11月16日 11:05
  • 770

C语言隐式数据类型转换

C的隐式数据类型转换:C语言中发生隐式数据类型转换的4种情况: 1.算数运算式中 2.赋值表达式中 3.函数调用参数传递时 4.函数返回返回值时1.算数运算式中进行算数运算时,不同数据类型必须...
  • codeTZ
  • codeTZ
  • 2016年04月17日 20:32
  • 346
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C语言】数据类型转换导致读取参数错误
举报原因:
原因补充:

(最多只允许输入30个字)