printf 打印结构体成员函数出错原因分析
定义一个结构体:
unsigned char data[] = {0x00,0x00,0xFF,0xFB,0x00,0xFF,0xFB}
typedef struct serial_data{unsigned int head; unsigned char command; unsigned char data; unsigned short num; unsigned short reply; unsigned short verify;
} data_s;
data_s dat;//声明结构体变量dat.command = (signed char)(data[4]);
dat.data = (signed char)(data[5]);
dat.num = (signed short)((data[6]<<8) + (data[7]));
dat.reply = (signed char)(data[8]<<8);
dat.verify = (signed short)((data[9]<<8) + (data[10]));
如果采用printf 进行打印,如下:
printf("dat.command = %d\n,dat.data = %d\n,dat.num = %d\n,dat.reply = %d\n,dat.verify = %d\n”,dat.command,dat.data,dat.num,dat.reply,dat.verify);
由于将unsigned char 型的按照%d 打印,导致结构体中的内存偏移,原本command 占1个字节,现在打印出来两个字节,也就是占用了data的一个字节,这样command之后的结构体成员地址都往后偏移一个字节,导致打印出错。
因此打印改成printf("dat.command = %c\n,dat.data = %c\n,dat.num = %d\n,dat.reply = %c\n,dat.verify = %d\n”,dat.command,dat.data,dat.num,dat.reply,dat.verify);
此时再看打印结果,便是正确的。
*****打印所有结构体的成员时,只要有一个成员的输出控制格式不正确,就会导致该成员及其后面的成员内存偏移,导致打印出错!!!!
printf 打印结构体成员函数出错原因分析相关推荐
- printf打印结构体_工程师:这道题80%初学者都没做对!你确定搞懂结构体内存对齐了?...
这是工程师面试后的实际经历-- 这道经典.易错的关于C语言结构体内存对齐的题目,你真的会吗: 求32bit环境下以下结构体所占的字节数:typedef struct test_struct{ char ...
- go 打印结构体对象,结构体指针
简言 1. go语言提供了简洁的打印功能,比如%d, %v, %+v等等,具体可以参考笔者的这篇博客 https://blog.csdn.net/yzf279533105/article/detail ...
- 通过宏函数计算结构体成员偏移量
编译器在为结构体成员分配内存时,由于存在内存对齐机制,各个成员所占空间可能不是连续的,因而不能简单的通过成员类型所占的字长来推断其它成员或结构体对象的地址. 获得结构体成员偏移量的方法可以参照 ...
- C语言结构体成员有函数的定义与使用
```c#include <stdio.h> typedef int (*FunHandle)(int, int); //定义 指向函数的指针 struct Example {int a; ...
- Go 打印结构体(struct)信息:fmt.Printf(“%+v“, user)
转自:打印 Go 结构体(struct)信息:fmt.Printf("%+v", user) package mainimport "fmt"// 用户 typ ...
- FFMpeg4.0相关结构体和函数
文章目录 相关指令 相关结构体 av_register_all() 已废弃无需添加 avformat_network_init() 初始化网络封装库 AVFormatContext结构体 AVDict ...
- 结构体成员数组不定长如何实现
[目的] 定义一个结构体类,其中的成员变量数组长度不定,根据实例化的对象指定长度,所以想到用指针实现 [现状] 指针可以指向任意长度数组,但结构体类只分配指针本身4字节长度,所以无法扩展 1 /** ...
- Golang——结构体创建与初始化、结构体与数组、结构体与切片、结构体与map、结构体作为函数参数、结构体方法、结构体方法继承
结构体: 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 结构体可以很好的管理一批有联系的数据,使用结构体可以提高程序的易读性,类似于Java的类一样 不能在结构体直接赋值 字段名必须唯一 ...
- C语言学习笔记---结构体作为函数参数和返回值
结构体不仅可以作为函数的参数传递,也可以作为函数的返回值.现在就分别来看一下这两种情况. 结构体作为参数 struct score {int chinese;int math;int englis ...
最新文章
- leetcode--整数反转--python
- web框架总结(django、flask)
- 201621123023《Java程序设计》第7周学习总结
- VS 中配置使用Visual SVN系列 五:SVN Client的配置和使用
- 华为动态NAT小实验演示
- Error message IBase category does not exist in table T371A
- 2017西安交大ACM小学期 文本查找[AC自动机]
- 《深入浅出DPDK》读书笔记(三):NUMA - Non Uniform Memory Architecture 非统一内存架构
- 将本地代码上传github
- eclipse项目如何变成web项目_Eclipse中将Java项目转换成Web项目的方法
- 关于人工智能你需要了解的事
- Chinapub要买的书
- JAVA排课教务系统
- ffmpeg将amr文件转成mp3文件
- 前后端处理实时刷新refresh_token的使用
- 三级网络技术备考重点之中小型网络系统总体规划与设计
- springboot+poi开发excel导出 加载Excel模板导出 Excel批量导出详解
- 几个好玩有趣的Python入门实例
- java 动态分区 链表_大二作业——操作系统实验——C语言用双向链表,模拟实现动态分区式存储管理...
- VsCode使用Git连接Gitee和GitHub