16

次の関数でがn等しくないのはなぜですか?8

void foo(char cvalue[8])
{
  int n = sizeof (cvalue);
}

しかし、このバージョンの関数では次のようになりますn 8

void bar()
{
  char cvalue[8];
  int n = sizeof (cvalue);
}
4

4 に答える 4

47

Cでは配列全体を関数パラメーターとして渡すことはできないためです。実際には、配列へのポインターを渡しています。括弧はシンタックスシュガーです。この関数は任意の文字ポインターを渡すことができるため、ポイントしている配列のサイズが8であるという保証はありません。

// These all do the same thing
void foo(char cvalue[8])
void foo(char cvalue[])
void foo(char *cvalue)
于 2008-09-08T02:35:55.923 に答える
14

C および C++ 配列はファースト クラス オブジェクトではありません。配列を関数に渡すことはできません。配列は常にポインターに減衰します。

ただし、ポインターと参照を配列に渡すことはできます。これにより、配列の境界が減衰するのを防ぎます。したがって、これは合法です:

template<typename T, size_t N>
void foo(const T(&arr)[N])
{
    int n = sizeof(arr);
}
于 2008-09-08T13:03:29.580 に答える
1

最初の例では、渡されたパラメーターとしてのcvalueは、実際には文字配列への単なるポインターでありsizeof()、それを取得すると、ポインターのサイズを取得します。ローカル変数として宣言した2番目のケースでは、配列全体のサイズを取得します。

于 2008-09-08T02:41:28.623 に答える
0

32ビットシステムではパラメータのサイズは4になり、-m64でコンパイルされた64ビットシステムでは8になります。これは、配列が関数内のポインタとして渡されるためです。ポインタは単なるメモリアドレスです。

于 2008-09-08T03:39:14.740 に答える