リンクで指定されているように、長さゼロの配列で構造体を初期化できます。
長さゼロ。
私は次の構造を使用しています:
typedef unsigned char UINT8;
typedef unsigned short UINT16;
typedef struct _CommandHeader
{
UINT16 len;
UINT8 payload[0];
} CommandHeader;
typedef struct _CmdXHeader
{
UINT8 len;
UINT8 payload[0];
} CmdXhHeader;
CommandHeader.payload は CmdXHeader 構造体を指す/含む必要があります。つまり、メモリは次のようになります。
-------------------------------------------------------------
| CommandHeader.len | CmdXHeader.len | CmdXHeader.payload ....|
-------------------------------------------------------------
CmdXHeader / CommandHeader をカスタマイズした長さに簡単に malloc できます。しかし、CmdXHeader ペイロードに値を割り当てる方法、または CmdXHeader オブジェクトを CommandHeader.payload にリンクする方法は?
私の解決策
返信ありがとうございます。次の方法で解決しました。
//Get the buffer for CmdXHeader:
size_t cmdXHeader_len = sizeof(CmdXHeader) + custom_len;
CmdXHeader* cmdXHeader = (CmdXHeader*) malloc(cmdXHeader_len);
//Get a temporary pointer and assign the data to it
UINT8* p;
p[0] = 1;
p[2] = 2;
.......
//Now copy the memory of p to cmdXHeader
memcopy(cmdHeader->payload, p, custom_len);
// allocate the buffer for CommandHeader
CommandHeader* commandHeader = (CommandHeader*) malloc (sizeof (CommandHeader) + cmdXHeader_len);
// populate the fields in commandHeader
commandHeader->len = custom_len;
memcpy(commandHeader->payload, cmdXHeader, cmdXHeader_len);
これで、commandHeader オブジェクトに必要なメモリが確保され、任意の方法で型キャストできるようになりました...