一般我们计算结构体的大小都习惯于使用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];
};