什么是变长结构体
变长结构体是由gcc扩展的一种技术,它是指其最后一个成员的长度不固定(flexible array member,也叫柔性数组)。
使用范围:数据长度不固定,例如协议对接中有固定的头结构体,数据结构体不固定。
定义变长结构体
struct MyData
{
int nLen;
char data[0];
};
或
struct MyData
{
int nLen;
char data[];
};
变长结构体实例
实例1:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef struct
{
unsigned int optType;
unsigned int err;
unsigned int command;
unsigned char data[0]; /*0-61440, 扩展负载数据,用于传递命令的请求输入或应答输出*/
}DataHead_V1;
typedef struct
{
unsigned int optType;
unsigned int err;
unsigned int command;
unsigned char data[];
}DataHead_V2;
typedef struct
{
unsigned int optType;
unsigned int err;
unsigned int command;
unsigned char data[1];
}DataHead_V3;
typedef struct
{
unsigned int optType;
unsigned int err;
unsigned int command;
unsigned char *pdata;
}DataHead_V4;
int main()
{
printf("sizeof(DataHead_V1) = %lu\n", sizeof(DataHead_V1));
printf("sizeof(DataHead_V2) = %lu\n", sizeof(DataHead_V2));
printf("sizeof(DataHead_V3) = %lu\n", sizeof(DataHead_V3));
printf("sizeof(DataHead_V4) = %lu\n", sizeof(DataHead_V4));
return 0;
}
实例2:协议传输发送/解析
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef struct
{
unsigned int optType;
unsigned int err;
unsigned int command;
unsigned char data[0]; /*0-61440, 扩展负载数据,用于传递命令的请求输入或应答输出*/
}DataHead;
typedef struct
{
unsigned char devicename[64];
}DeviceInfo;
int main()
{
printf("sizeof(DataHead) = %lu\n", sizeof(DataHead));
char *pbuffer = NULL;
DataHead *pDataHead = NULL;
char str[12] = "123456789";
DeviceInfo *pdeviceInfo = NULL;
pbuffer = (char *)malloc(1024);
memset(pbuffer,0,1024);
pDataHead = (DataHead *)pbuffer;
pdeviceInfo = (DeviceInfo *)(pDataHead->data);
memcpy(pdeviceInfo->devicename, str, 12);
printf("pdeviceInfo->devicename = %s\n", pdeviceInfo->devicename);
//传输数[据](http://blog.itpub.net/29753604/viewspace-1281907/)总长度计算
printf("all data len = %lu \n", sizeof(DataHead)+sizeof(DeviceInfo));
free(pbuffer);
return 0;
}
参考资料
http://blog.itpub.net/29753604/viewspace-1281907/
https://blog.csdn.net/move_now/article/details/71929225
https://blog.csdn.net/peng864534630/article/details/77620717