【目的】

  定义一个结构体类,其中的成员变量数组长度不定,根据实例化的对象指定长度,所以想到用指针实现

【现状】

  指针可以指向任意长度数组,但结构体类只分配指针本身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

结构体成员数组不定长如何实现相关推荐

  1. C语言 | 结构体成员数组赋值的问题

    C语言只有在定义字符数组的时候才能用"="来初始化变量,其它情况下是不能直接用"="来为字符数组赋值的,之所以不能赋值成功,是因为数组名是一个指针常量,指向固定 ...

  2. FFmpeg源代码简单分析:结构体成员管理系统-AVOption

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  3. 第四天2017/03/31(下午1:结构体、数组)

    //备用知识:没有内存,哪有指针? int main() {//错误程序char *name; //此处只定义了指针name(指针占4个字节),并没有给name分配内存//name = (char*) ...

  4. Golang——结构体创建与初始化、结构体与数组、结构体与切片、结构体与map、结构体作为函数参数、结构体方法、结构体方法继承

    结构体: 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 结构体可以很好的管理一批有联系的数据,使用结构体可以提高程序的易读性,类似于Java的类一样 不能在结构体直接赋值 字段名必须唯一 ...

  5. Go的反射是如何获取结构体成员信息的?

    前言 哈喽,大家好,今天这篇文章的目的主要是解答一位读者的疑问,涉及知识点是反射和结构体内存布局.我们先看一下读者的问题: img 我们通过两个问题来解决他的疑惑: 结构体在内存中是如何存储的 反射获 ...

  6. C语言及程序设计进阶例程-12 结构体成员的引用

    贺老师教学链接  C语言及程序设计进阶 本课讲解 结构体作函数参数 #include <stdio.h> struct Student {int num;char name[20];cha ...

  7. FFmpeg源代码简单分析:结构体成员管理系统-AVClass

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  8. C语言中的结构体,结构体中数组初始化与赋值

    最近写c语言中的结构体遇到了些问题,从网上找了些资料如下: 结构体是连续存储的,但由于结构体中成员类型各异,所以会存在内存对齐问题,也就是内存里面会有空档,具体的对齐方式这里 暂不讨论: 1.结构体的 ...

  9. 结构体之引用结构体成员变量

    引用结构体成员变量 一个结构体包含一个或者多个成员变量,在实际使用中,就需要对其成员变量进行引用,对于一个已经定义了的结构体变量和一个指向该结构体的指针变量. 可以用一下三种情况引用结构体 成员变量. ...

最新文章

  1. c++ 返回对象的引用要小心
  2. TFS多地办公时的处理
  3. java学习笔记IO之字节输入输出流
  4. springcloud服务熔断和服务降级的自我理解
  5. lxterminal命令打开新窗口并执行python脚本
  6. orangepi获取cpu温度
  7. android开发笔记之xml矢量图片
  8. 计算机网络面试基础知识
  9. Sql中的触发器(Triggers)
  10. android手机怎么改字体,手机字体怎么改 安卓手机字体修改教程
  11. 捷径app 未能连接到服务器,iOS13快捷指令无法添加第三方捷径的解决办法
  12. python cv2统一缩放图片尺寸,将透明背景填充白色
  13. 百度网盘不限速下载10M/S
  14. java对接支付宝三方登录
  15. Office2003打开或关闭word Excel文档出现发送错误报告
  16. java投票排名怎么弄_投票排名算法
  17. 我所玩过的GALGAME——メンアットワーク!魔兽学院men at work2的中文版《永远的羁绊》全攻略
  18. linux脚本获取日期格式,关于shell脚本中的bash:yyyy-mm-dd格式日期
  19. 2018.7.10 无线充电方案 调试
  20. 匿名无人机飞控代码整理3

热门文章

  1. linux shell cgi post,linux下shell处理cgi的方法--post get
  2. 《OpenCV3编程入门》学习笔记6 图像处理(七)阈值化
  3. c语言产生一m序列,其特征多相式:1+x^3+x^5,M序列伪随机码在测距回答概率控制中的 - FPGA/ASIC技术 - 电子发烧友网...
  4. C语言下标要求数组或指针,c语言改错 error C2109: 下标要求数组或指针类型怎么改?...
  5. 无监督学习与有监督学习的本质区别是什么_人工智能中的无监督学习
  6. mongo在哪创建管理员_MongoDB初始化创建管理员账户登录
  7. 微型计算机有什么电路组成,第二章 微型计算机的基本电路组成
  8. linux scp移动文件夹,linux scp远程拷贝文件及文件夹
  9. 怎么用迅雷下载python_我是如何使用python控制迅雷自动下载电影的?
  10. c语言课程设计的摘要,投票程序设计-C语言课程设计摘要.doc