54

私はいくつかの古いコードのリファクタリングに取り組んでおり、長さゼロの配列を含む構造体をいくつか見つけました (以下)。もちろん、プラグマによって抑制された警告ですが、そのような構造を含む「新しい」構造を作成できませんでした (エラー 2233)。配列 'byData' がポインターとして使用されていますが、代わりにポインターを使用しないのはなぜですか? または長さ1の配列?そしてもちろん、プロセスを楽しむためのコメントは追加されていません...そのようなものを使用する理由はありますか? それらをリファクタリングする際のアドバイスはありますか?

struct someData
{
   int nData;
   BYTE byData[0];
}

注意: C++、Windows XP、VS 2003 です。

4

5 に答える 5

36

はい、これは C ハックです。
任意の長さの配列を作成するには:

struct someData* mallocSomeData(int size)
{
    struct someData*  result = (struct someData*)malloc(sizeof(struct someData) + size * sizeof(BYTE));
    if (result)
    {    result->nData = size;
    }
    return result;
}

これで、指定された長さの配列を持つ someData のオブジェクトができました。

于 2008-11-17T16:53:22.210 に答える
26

残念ながら、構造体の末尾で長さゼロの配列を宣言する理由はいくつかあります。基本的に、API から可変長の構造体を返すことができます。

Raymond Chen は、このテーマに関する優れたブログ投稿を行いました。この投稿には、あなたが望む答えが含まれている可能性が高いため、この投稿をご覧になることをお勧めします。

彼の投稿では、サイズが 0 ではなく 1 の配列を扱っていることに注意してください。これは、長さゼロの配列が標準への最近のエントリであるためです。 彼の投稿はまだあなたの問題に当てはまるはずです。

http://blogs.msdn.com/oldnewthing/archive/2004/08/26/220873.aspx

編集

注: Raymond の投稿では、長さ 0 の配列は C99 では合法であると書かれていますが、実際には C99 ではまだ合法ではありません。ここでは長さ 0 の配列の代わりに、長さ 1 の配列を使用する必要があります

于 2008-11-17T06:59:34.390 に答える
23

これは、柔軟なサイズの配列を可能にする古い C のハックです。

C99 標準では、arr[] 構文をサポートしているため、これは必要ありません。

于 2008-11-17T06:58:04.923 に答える