可変長構造体

1409 ワード

よくニュース体が長くなることに会って、まとめてみます.構造体の芯を長くするという思想は構造体の最後のデータ構造を指針としています.この指針はこの構造体の末尾データを指しています.
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バイトの補完