21

関数ヘッダーで C 配列引数のサイズをわざわざ指定する必要がある理由を教えてもらえますか? 例えば:

void foo (int iz[6]) { iz[42] = 43; }

と:

int is[2] = {1,2,3};

有用なエラーが発生します。おそらく、コメント/ドキュメントに役立ちますか?

4

4 に答える 4

20

関数ヘッダーで C 配列引数のサイズをわざわざ指定する必要がある理由を教えてもらえますか? 例えば:

void foo (const char sz[6]) { sz[42] = 43; }

IMO、すべきではありません。配列を関数に渡そうとすると、実際に渡されるのは配列の先頭へのポインターです。関数が受け取るものはポインターになるため、それを明示的に記述することをお勧めします。

void foo(char const *sz)

次に、関数にサイズの手がかりが与えられていないことが明らかになったため、それを別のパラメーターとして追加します。

void foo(char const *sz, size_t size)
于 2011-03-03T22:16:04.557 に答える
8

コメントです。配列は、関数パラメーターのポインターに降格されます。ただし、コンパイラがコメントを読み取らなくても、コメントは有用です。

于 2011-03-03T22:11:28.073 に答える
0

これは、定義された size の配列を渡す必要があることをクライアント コードに伝えたい場合に便利なコメントです。つまり、次のようになります。

void foo(const char bar[5]);
/* It is expected that foo function receives an array of size 5 */

それでも、ドキュメントはコード チェックで置き換えられません。

void foo(const char bar[5])
{
    if (!bar) error();
    if (strlen(bar) != 4) error();
    /* ... */
}
于 2014-10-16T17:37:19.277 に答える