【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参数将编译警告视作错误
版权声明:本文为博主原创文章,未经博主允许不得转载。

json编码无法解析问题总结

在日常编程过程中,我们大多时间都会遇到数据的传递和接收,大量数据或者是键值对的数据形式,可以把数据处理成json串来传递,也方面我们获取其中的数据。但是在有些时候我们往往没有办法把json数据串的数据...
  • zchoney
  • zchoney
  • 2017年03月29日 20:03
  • 512

使用memcpy()系列函数时要足够小心

memcpy()、memset()、memcmp()等这些内存操作函数经常会帮我们完成一些数据复制、赋值等操作。因为在C语言中,无论是内置类型,还是自定义的结构类型(struct),其内存模型对于我们...
  • qq51931373
  • qq51931373
  • 2016年03月03日 14:01
  • 2597

解说同源策略和跨域访问

尽管浏览器的安全措施多种多样,但是要想黑掉一个Web应用,只要在浏览器的多种安全措施中找到某种措施的一个漏洞或者绕过一种安全措施的方法即可。浏览器的各种保安措施之间都试图保持相互独立,但是攻击者只要能...
  • navy_xue
  • navy_xue
  • 2014年10月12日 11:23
  • 9350

VMware 12.1.1 长模式不兼容/中断导致虚拟CPU进入关机或重启

“软件虚拟化与此平台上的长模式不兼容. 禁用长模式. 没有长模式支持, 虚拟机将不能运行 64位程序.”和“中断导致虚拟 CPU 进入关机状态. 如果中断发生在虚拟机外部, 其会造成物理机重启. “经...
  • duxuanwei
  • duxuanwei
  • 2016年07月22日 18:17
  • 633

VMware 长模式不兼容/中断导致虚拟CPU进入关机状态 的解决办法

今天为了调试程序,准备搭建个虚拟平台,之前的本本安装起来一切顺利,但是新笔记本出现了一堆让人头痛的问题,比如: “软件虚拟化与此平台上的长模式不兼容. 禁用长模式. 没有长模式支持, 虚拟机将不能运...
  • chfsuihan
  • chfsuihan
  • 2014年12月26日 22:33
  • 6686

数据库并发操作与数据的不一致性

http://www.cnblogs.com/softest/articles/2012585.html 如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发...
  • shubingzhuoxue
  • shubingzhuoxue
  • 2016年09月13日 11:23
  • 530

testNG参数化之excel读取数据

注意点:目前testNG 只支持2003左右的excel格式文件,但是文件名后缀要求必须是.xlsx,所以要把.xls的后缀名改为.xlsx,才能正常读取,真是个坑! 1、新建Excel文档,准备好...
  • jessysong
  • jessysong
  • 2016年11月12日 16:14
  • 647

利用IStorage和IStream存储自定义数据到Inventor文件 (C++)

我去年在全球博客就写了此文章,还有一个姊妹篇(用.NETx竟然没有
  • autodeskinventorapi
  • autodeskinventorapi
  • 2014年04月28日 12:43
  • 1066

一行代码解决:服务器返回null导致应用崩溃

背景1:是否有这样一种感受,你的应用会崩溃,查看崩溃日志或者调试发现后台返回的数据字段里面有null,这个null居然还是导致应用崩溃的“元凶”。 背景2:服务器返回的字段名和不一致,如果m...
  • moxi_wang
  • moxi_wang
  • 2016年08月12日 09:24
  • 591

(转)惨烈:1个Bug,45分钟损失4亿多美元

惨烈:1个Bug,45分钟损失4亿多美元2016-09-29 程序员的那些事 http://mp.weixin.qq.com/s?__biz=MjM5OTA1MDUyMA==&mid=2655436...
  • wowotuo
  • wowotuo
  • 2016年09月30日 08:55
  • 1393
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C语言】数据类型转换导致读取参数错误
举报原因:
原因补充:

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