结构体成员数组不定长如何实现
【目的】
定义一个结构体类,其中的成员变量数组长度不定,根据实例化的对象指定长度,所以想到用指针实现
【现状】
指针可以指向任意长度数组,但结构体类只分配指针本身4字节长度,所以无法扩展
1 /** 2 *************************************************************************************************** 3 * 4 * @FileName Data structure of device 5 * 6 * @Editor Skullboyer 7 * 8 * @EditTime 2017-12-27 9 * 10 * @Version V0.1 11 * 12 * @Note 13 * 14 *************************************************************************************************** 15 */ 16 17 18 /* Define the data structure */ 19 typedef struct 20 { 21 uint8_t Msg_Head; /* 消息标识头 */ 22 uint16_t Msg_ID; /* 消息 ID */ 23 uint16_t Msg_Prop; /* 消息体属性 */ 24 uint8_t Term_Phone[6]; /* 终端手机号 */ 25 uint16_t Msg_SwiftNum; /* 消息流水号 */ 26 void *Message; /* 消息体 */ 27 uint8_t Msg_CRC; /* 校验码 */ 28 uint8_t Msg_Tail; /* 消息标识尾 */ 29 }DATA_s; 30 31 /* Instantiated objects ---------------------------------*/ 32 DATA_s sMedia; 33 34 /* GPS structure */ 35 uint8_t uGPS_Data[28]; 36 DATA_s sGPS = 37 { 38 0x7E; 39 0x0200; 40 0x****; 41 0x**, 0x**, 0x**, 0x**, 0x**, 0x**; 42 0x****; 43 uGPS_Data; 44 0x**; 45 0x7E; 46 } 47 48 /* TMPS structure */ 49 uint8_t uTMPS_Data[1024]; /* 最大支持1024个轮胎 10bit */ 50 DATA_s sTMPS = 51 { 52 0x7E; 53 0x0205; 54 0x****; 55 0x**, 0x**, 0x**, 0x**, 0x**, 0x**; 56 0x****; 57 uTMPS_Data; 58 0x**; 59 0x7E; 60 } 61 62 /* POSE structure */ 63 uint8_t uPOSE_Data[28]; 64 DATA_s sPOSE = 65 { 66 0x7E; 67 0x0206; 68 0x****; 69 0x**, 0x**, 0x**, 0x**, 0x**, 0x**; 70 0x****; 71 uPOSE_Data; 72 0x**; 73 0x7E; 74 } 75 76 /* OBD structure */ 77 uint8_t uOBD_Data[202]; 78 DATA_s sOBD = 79 { 80 0x7E; 81 0x0207; 82 0x****; 83 0x**, 0x**, 0x**, 0x**, 0x**, 0x**; 84 0x****; 85 uOBD_Data; 86 0x**; 87 0x7E; 88 } 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 /******************************************^_^\__END__/^_^******************************************/
验证相关代码
1 #include "stdio.h" 2 #include "stdlib.h" 3 4 /* 类别名 */ 5 typedef unsigned char uint8_t; 6 typedef unsigned short int uint16_t; 7 typedef unsigned int uint32_t; 8 9 /* 单字节对齐 */ 10 #pragma pack(1) 11 12 /* Define the data structure ------------------------------*/ 13 typedef struct 14 { 15 uint8_t Msg_Head; /* ???¢±êê?í· */ 16 uint16_t Msg_ID; /* ???¢ ID */ 17 uint16_t Msg_Prop; /* ???¢ì?ê?D? */ 18 uint8_t Term_Phone[6]; /* ????ê??úo? */ 19 uint16_t Msg_SwiftNum; /* ???¢á÷??o? */ 20 uint8_t *Message; /* ???¢ì? */ 21 // void *Message; /* void*在下边打印出错 */ 22 uint8_t Msg_CRC; /* D£?é?? */ 23 uint8_t Msg_Tail; /* ???¢±êê??2 */ 24 }DATA_s; 25 26 #pragma pack() 27 28 typedef union 29 { 30 DATA_s sObj; 31 uint8_t uByte[]; /* 以不指定长度的数组来控制数据按字节输出,其长度由 DATA_s 类长度决定 */ 32 // uint8_t *uByte; /* 愿望以字节指针控制数据按字节输出,但愿望失败,经测试无法控制到字节地址,只能控制字地址 */ 33 }DATA_u; 34 35 /* Instantiated objects ---------------------------------*/ 36 DATA_s sMedia; 37 38 /* GPS structure */ 39 uint8_t uGPS_Data[28]; 40 DATA_u uGPS ; 41 DATA_s sGPS = 42 { 43 0x7E, 44 0x0200, 45 0x1234, 46 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 47 0x5A5A, 48 uGPS_Data, 49 0x12, 50 0x7E 51 }; 52 53 /* TMPS structure */ 54 uint8_t uTMPS_Data[1024]; /* ×?′ó?§3?1024????ì¥ 10bit */ 55 DATA_s sTMPS = 56 { 57 0x7E, 58 0x0205, 59 0x5678, 60 0xDE, 0xF0, 0x12, 0x34, 0x56, 0x78, 61 0xA5A5, 62 uTMPS_Data, 63 0x34, 64 0x7E 65 }; 66 67 /* POSE structure */ 68 uint8_t uPOSE_Data[28]; 69 DATA_s sPOSE = 70 { 71 0x7E, 72 0x0206, 73 0x9ABC, 74 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 75 0x55AA, 76 uPOSE_Data, 77 0x56, 78 0x7E 79 }; 80 81 /* OBD structure */ 82 uint8_t uOBD_Data[202]; 83 DATA_s sOBD = 84 { 85 0x7E, 86 0x0207, 87 0xDEF0, 88 0x32, 0x10, 0xFE, 0xDC, 0xBA, 0x98, 89 0xAA55, 90 uOBD_Data, 91 0x78, 92 0x7E 93 }; 94 95 int main(void) 96 { 97 98 uint16_t i, j; 99 uint16_t GPS_Len; 100 DATA_s *p; 101 102 /* 类型大小 */ 103 printf("\n----------------类型大小--------------------\n"); 104 printf("\nsizeof(uint8_t)= %d\n", sizeof(uint8_t)); 105 printf("sizeof(uint16_t)= %d\n", sizeof(uint16_t)); 106 printf("sizeof(DATA_s)= %d\n", sizeof(DATA_s)); 107 printf("\n--------------------------------------------\n"); 108 109 /* 数组初始化 */ 110 for(i = 0; i < 28; i++) 111 uGPS_Data[i] = i; 112 113 for(i = 0; i < 1024; i++) 114 uTMPS_Data[i] = i; 115 116 for(i = 0; i < 28; i++) 117 uPOSE_Data[i] = i; 118 119 for(i = 0; i < 202; i++) 120 uOBD_Data[i] = i; 121 122 DATA_s sGPS = 123 { 124 0x7E, 125 0x0200, 126 0x1234, 127 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 128 0x5A5A, 129 uGPS_Data, 130 0x12, 131 0x7E 132 }; 133 134 /* 联合体赋值 */ 135 GPS_Len = sizeof(DATA_s) + sizeof(uGPS_Data) - 4; /* sGPS所占字节数(指针成员初始化后) */ 136 printf("\n----------------GPS对象大小--------------------\n"); 137 printf("\nGPS_Len= %d\n", GPS_Len); 138 printf("\n-----------------------------------------------\n"); 139 // uGPS.uByte = (uint8_t *)malloc(GPS_Len); /* 联合体中的指针分配必须在其结构体赋值之前,否则后分配的指针对应的值是乱码,将冲掉已正确赋值的结构体 */ 140 uGPS.sObj = sGPS; 141 // uGPS.uByte = &uGPS.sObj.Msg_Head; /* 将结构体第一个变量地址赋给共用体指针,导致地址与实际变化了,为什么要赋地址,因为调试发现共用体的成员之间地址不统一 */ 142 143 /* 结构体对象间赋值 */ 144 sMedia = sGPS; 145 printf("\n----------------结构体对象整体赋值--------------------\n"); 146 printf("\nsMedia.Msg_Head= %#X\n", sMedia.Msg_Head); 147 printf("\n------------------------------------------------------\n"); 148 149 p = &sGPS; 150 printf("\n----------------sizeof对象大小--------------------\n"); 151 printf("\nsizeof(uGPS_Data)= %d\n", sizeof(uGPS_Data)); 152 printf("sizeof(sGPS)= %d\n", sizeof(sGPS)); 153 printf("\n--------------------------------------------------\n"); 154 155 printf("\n----------------sizeof指针成员大小--------------------\n"); 156 printf("\nsizeof(p->Message)= %d\n", sizeof(p->Message)); 157 printf("sizeof(sGPS.Message)= %d\n", sizeof(sGPS.Message)); 158 printf("\n------------------------------------------------------\n"); 159 160 #if 0 161 printf("%#X\n", p->Msg_Head); 162 printf("%#X\n", p->Msg_ID); 163 printf("%#X\n", p->Msg_Prop); 164 printf("%#X\n", p->Term_Phone); 165 printf("%#X\n", p->Msg_SwiftNum); 166 printf("%#X\n", p->Message); 167 printf("%#X\n", p->Msg_CRC); 168 printf("%#X\n", p->Msg_Tail); 169 #endif 170 171 /* 联合体输出 */ 172 printf("\n----------------联合体对象--------------------\n"); 173 printf("\nuGPS.sObj.Msg_Head= %#X\n", uGPS.sObj.Msg_Head); 174 printf("&uGPS.sObj.Msg_Head= %#X\n", &uGPS.sObj.Msg_Head); 175 printf("uGPS.uByte= %#X\n", uGPS.uByte); 176 printf("*uGPS.uByte= %#X\n", *uGPS.uByte); 177 printf("\n----------------------------------------------\n"); 178 179 180 181 182 /* 愿望以联合体的字节变量输出 */ 183 printf("\n----------------以联合体的字节变量输出--------------------\n"); 184 for(i = 0; i < GPS_Len; i++) 185 { 186 printf("%#X\t", uGPS.uByte[i]); /* */ 187 } 188 printf("\n----------------------------------------------------------\n"); 189 190 191 printf("\n----------------以传统之法输出--------------------\n"); 192 /* 上边愿望失败,改此补之,失败在指针成员处 */ 193 /* 除去指针,其余以联合体的字节变量输出 */ 194 for(i = 0; i < sizeof(DATA_s); i++) /**/ 195 { 196 if(i == 13) /* 到达指针 Message 处 */ 197 { 198 for(j = 0; j < 28; j++) 199 { 200 printf("%d\t", p->Message[j]); /* 以传统方法输出 */ 201 } 202 i += 4; /* 跨过结构体成员指针 Message 占据的4Bytes */ 203 } 204 printf("%#X\t", uGPS.uByte[i]); 205 } 206 printf("\n--------------------------------------------------\n"); 207 208 return 0; 209 }
转载于:https://www.cnblogs.com/skullboyer/p/8135762.html
结构体成员数组不定长如何实现相关推荐
- C语言 | 结构体成员数组赋值的问题
C语言只有在定义字符数组的时候才能用"="来初始化变量,其它情况下是不能直接用"="来为字符数组赋值的,之所以不能赋值成功,是因为数组名是一个指针常量,指向固定 ...
- FFmpeg源代码简单分析:结构体成员管理系统-AVOption
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- 第四天2017/03/31(下午1:结构体、数组)
//备用知识:没有内存,哪有指针? int main() {//错误程序char *name; //此处只定义了指针name(指针占4个字节),并没有给name分配内存//name = (char*) ...
- Golang——结构体创建与初始化、结构体与数组、结构体与切片、结构体与map、结构体作为函数参数、结构体方法、结构体方法继承
结构体: 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 结构体可以很好的管理一批有联系的数据,使用结构体可以提高程序的易读性,类似于Java的类一样 不能在结构体直接赋值 字段名必须唯一 ...
- Go的反射是如何获取结构体成员信息的?
前言 哈喽,大家好,今天这篇文章的目的主要是解答一位读者的疑问,涉及知识点是反射和结构体内存布局.我们先看一下读者的问题: img 我们通过两个问题来解决他的疑惑: 结构体在内存中是如何存储的 反射获 ...
- C语言及程序设计进阶例程-12 结构体成员的引用
贺老师教学链接 C语言及程序设计进阶 本课讲解 结构体作函数参数 #include <stdio.h> struct Student {int num;char name[20];cha ...
- FFmpeg源代码简单分析:结构体成员管理系统-AVClass
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- C语言中的结构体,结构体中数组初始化与赋值
最近写c语言中的结构体遇到了些问题,从网上找了些资料如下: 结构体是连续存储的,但由于结构体中成员类型各异,所以会存在内存对齐问题,也就是内存里面会有空档,具体的对齐方式这里 暂不讨论: 1.结构体的 ...
- 结构体之引用结构体成员变量
引用结构体成员变量 一个结构体包含一个或者多个成员变量,在实际使用中,就需要对其成员变量进行引用,对于一个已经定义了的结构体变量和一个指向该结构体的指针变量. 可以用一下三种情况引用结构体 成员变量. ...
最新文章
- c++ 返回对象的引用要小心
- TFS多地办公时的处理
- java学习笔记IO之字节输入输出流
- springcloud服务熔断和服务降级的自我理解
- lxterminal命令打开新窗口并执行python脚本
- orangepi获取cpu温度
- android开发笔记之xml矢量图片
- 计算机网络面试基础知识
- Sql中的触发器(Triggers)
- android手机怎么改字体,手机字体怎么改 安卓手机字体修改教程
- 捷径app 未能连接到服务器,iOS13快捷指令无法添加第三方捷径的解决办法
- python cv2统一缩放图片尺寸,将透明背景填充白色
- 百度网盘不限速下载10M/S
- java对接支付宝三方登录
- Office2003打开或关闭word Excel文档出现发送错误报告
- java投票排名怎么弄_投票排名算法
- 我所玩过的GALGAME——メンアットワーク!魔兽学院men at work2的中文版《永远的羁绊》全攻略
- linux脚本获取日期格式,关于shell脚本中的bash:yyyy-mm-dd格式日期
- 2018.7.10 无线充电方案 调试
- 匿名无人机飞控代码整理3
热门文章
- linux shell cgi post,linux下shell处理cgi的方法--post get
- 《OpenCV3编程入门》学习笔记6 图像处理(七)阈值化
- c语言产生一m序列,其特征多相式:1+x^3+x^5,M序列伪随机码在测距回答概率控制中的 - FPGA/ASIC技术 - 电子发烧友网...
- C语言下标要求数组或指针,c语言改错 error C2109: 下标要求数组或指针类型怎么改?...
- 无监督学习与有监督学习的本质区别是什么_人工智能中的无监督学习
- mongo在哪创建管理员_MongoDB初始化创建管理员账户登录
- 微型计算机有什么电路组成,第二章 微型计算机的基本电路组成
- linux scp移动文件夹,linux scp远程拷贝文件及文件夹
- 怎么用迅雷下载python_我是如何使用python控制迅雷自动下载电影的?
- c语言课程设计的摘要,投票程序设计-C语言课程设计摘要.doc