可変長構造体
1409 ワード
よくニュース体が長くなることに会って、まとめてみます.構造体の芯を長くするという思想は構造体の最後のデータ構造を指針としています.この指針はこの構造体の末尾データを指しています.
上のzmqMsgBody[0]の定義を見たら、おかしいと思いますが、実はこの構造体の末尾を指す役割があります.彼はどう使いますか?
もう一つのテーマは、zmqMsgBody[0]という定義があるコンパイラがありますが、解決方法はzmqMsgBody[1]に簡単に変えられます.ただし、zmqMsgBody[0]のサイズが変更される場合は、この項目は構造体長には算入されませんが、zmqMsgBody[1]はこの項目の長さを構造体長に加え、バイト補完(1バイト揃えの場合は補完が必要ではありません).TCP_SERVER_MSG構造体
[0]時:sizeof(TSuTCP SERVERMSG)=8
[1]時:sizeof(TSuTCPuSERVERMSG)=8+1+3=12 //3バイトの補完
typedef struct stru_tcp_server_msg
{
uint32_ msgLength; // , msgLength
uint32_ returnCode; // TcpServer
uint8_ zmqMsgBody[0]; //
}TS_TCP_SERVER_MSG;
上のzmqMsgBody[0]の定義を見たら、おかしいと思いますが、実はこの構造体の末尾を指す役割があります.彼はどう使いますか?
typedef struct stru_zmq_server_msg
{
uint32_ deviceId;
uint32_ msgCode;
}TS_ZMQ_SERVER_MSG;
int len = sizeof(TS_TCP_SERVER_MSG) +
sizeof(TS_ZMQ_SERVER_MSG);
TS_TCP_SERVER_MSG* tdata = (TS_TCP_SERVER_MSG*)malloc(len);
tdata->msgLength = len;
tdata->returnCode = 0;
TS_ZMQ_SERVER_MSG* data = (TS_ZMQ_SERVER_MSG*)tdata->zmqMsgBody;
data->deviceId = 100;
data->msgCode = TS_DEVICE_CONFIG_REQ_MSG;
このように、mallecはsizeof(TSuTCPuSERVERMSG)+ sizeof(TSUZMQUSERVERUMSG)の長さのデータブロックであればいいです.コードtdata->zmqMsgBodyが指すのはTS_です.TCP_SERVER_MSG構造体の最後の位置、つまりTS_ZMQ_SERVER_MSGの先頭位置もう一つのテーマは、zmqMsgBody[0]という定義があるコンパイラがありますが、解決方法はzmqMsgBody[1]に簡単に変えられます.ただし、zmqMsgBody[0]のサイズが変更される場合は、この項目は構造体長には算入されませんが、zmqMsgBody[1]はこの項目の長さを構造体長に加え、バイト補完(1バイト揃えの場合は補完が必要ではありません).TCP_SERVER_MSG構造体
[0]時:sizeof(TSuTCP SERVERMSG)=8
[1]時:sizeof(TSuTCPuSERVERMSG)=8+1+3=12 //3バイトの補完