变长结构体

什么是变长结构体

变长结构体是由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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值