可变大小结构体

一般我们计算结构体的大小都习惯于使用sizeof,但对于可变大小结构体就不能用sizeof来的那么简单了,如结构体:

typedef struct TMyData
{
	char m_cDataA;
	char m_cDataB;
};

typedef struct TMyMessage
{
	int	m_nNumA;
	int 	m_nNumB;
	char 	m_nData[0];
};

测试可知,sizoof(TMyMessage)的大小为8,m_nData的作用是指向TMyMessage的末尾,用于指向TMyData的地址,具体使用如下:

int nSize = sizeof(TMyMessage) + sizeof(TMyData);
TMyMessage* pMyStruct = (TMyMessage*)malloc(nSize); 
pMyStruct->m_nNumA = 1;
pMyStruct->m_nNumB = 2;


TMyData* pMyData = (TMyData*)pMyStruct->m_nData;
pMyData->m_cDataA = 'A';
pMyData->m_cDataB = 'B';


// 发送如下
MySend(pMyStruct, nSize);


特别注意的是,此时的nSize不再是8,而是sizeof(TMyMessage) + sizeof(TMyData) = 8 + 4 = 12。sizeof(TMyData) = 1 + 1 + 2 = 4 (2为字节补齐)

有的编译器m_nData[0]编译不过,改成m_nData[1]即可

[0]时: sizeof(TMyMessage) = 8
[1]时: sizeof(TMyMessage) = 8 + 1 + 3 = 12 (3为字节补齐)

在接收方处理时,也要计算nSize的大小,亦不能直接sizeof(TMystruct)来计算


建议

以后如需要用到可变大小结构体时,可在结构体中加入结构体长度或结构类型,方便接收方分析,结构体改进如下:

typedef struct TMyMessage1
{
	int	m_nMsgLen;	// 消息体长度,此长度为整个消息长度,包括TMyMessage本身的长度
	int 	m_nNumA;
	int 	m_nNumB;
	char 	m_nData[0];
};

typedef struct TMyMessage2
{
	int	m_nMsgType;	// 消息对应的结构体类型
	int 	m_nNumA;
	int 	m_nNumB;
	char 	m_nData[0];
};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值