C:動的にサイズ変更される構造体の推奨スタイル

ここでのガイダンスとして、動的にサイズ変更された構造の既存の例をいくつか確認する必要があると思います。私が知っている最も良い例は、Win32 の TOKEN API です。彼らはマクロ ANYSIZE_ARRAY を使用しますが、これは 1 に解決されます。Raymond Chen は、なぜこのように行われるのかを正確に詳述した広範なブログ記事を作成しました

  • https://devblogs.microsoft.com/oldnewthing/20040826-00/?p=38043

sizeof 失敗などの操作について。動的にサイズ変更された構造体に対してどのソリューションを選択しても、これは失敗します。 sizeof はコンパイル時の操作であり、実行時に構造のサイズを変更します。それは単に機能しません。


古典的な問題。単純に対処できます (また、コンパイラが構造体のサイズを切り上げた場合、sizeof(foo) は 1 以上ずれている可能性があることに注意してください)。>

struct packetheader {
   int id;
   int filename_len;
};
struct packet {
   struct packetheader h;
   char filename[1];
};

これは面倒です (h.id などを使用する必要があります) が、機能します。通常、私はそれを 1 つだけ扱いますが、上記の方がわずかに移植性が高いかもしれません。


char filename[1] を使用することをお勧めします 終端の 0 バイトを含めます。このようにして、 malloc() できます 構造のサイズを正しく設定し、次のような 1 回限りのエラーを回避してください:

ptr = malloc(sizeof(struct packet)+filename_len);
strncpy(&ptr->filename, filename, filename_len);

ただし、受信側は filename_len+1 を読み取る必要があることを認識している必要があります。 バイト。