1

重複の可能性:
Cプログラミング言語の配列のサイズ?

値が配列にある場合に1を返す関数を作成しようとしています。コードは次のとおりです。

int inArrayInt(int iVal, int iArray[])
{
    int i;
    int arrayL = sizeof(*iArray) / sizeof(int);
    int flag = 0;
    for(i=0; i < arrayL; i++)
    {
        if(iVal == iArray[i])
        {
            flag = 1;
        }
    }
    return flag;
}

問題は、arrayL = sizeof(*iArray) / sizeof(int);配列に20個の要素が含まれている場合でも、常に1と評価されることです。なんで?

4

4 に答える 4

6

配列を引数として関数に渡すと、配列がポインタに減衰するためです。したがって、sizeof(array)は配列のサイズではなく、ポインタのサイズを示します。

sizeof(array)が正しいサイズを提供するように、配列サイズを、として持つextra argumentか、配列をとして渡すことができます。reference(詳細はこちら:アレイの減衰とは何ですか?

于 2012-06-27T10:34:28.387 に答える
2

パラメータint iArray[]は。と同等int *iArrayです。

だからあなたがするとき

int arrayL=sizeof(*iArray)/sizeof(int);

あなたは実際にやっています

int arrayL=sizeof(int)/sizeof(int);

同じサイズです。

サイズ情報を渡すためのパラメータを追加する必要があります。

int inArrayInt(int iVal, int iArray[], size_t numel){
  ...
  for(i=0;i<numel;i++){
    ...
  }
}
于 2012-06-27T10:37:13.027 に答える
1

関数に渡すのは配列へのポインターであり、サイズを知る方法はありません。ポインタのサイズはintのサイズであるため、1

配列を反復処理する場合は、関数の引数で配列のサイズを一緒に渡す必要があります。

于 2012-06-27T10:32:32.173 に答える
1

配列サイズでパラメータを追加します。

int inArrayInt(int iVal, int* iArray, int sizeOfArray)
{
    int i;

    for(i = 0; i < sizeOfArray; i++)
    {
        if(iVal == iArray[i])
        {
            return 1;
        }
    }

   return 0;
}

次に、配列を開始したサイズで関数を呼び出します。

int myArray[100];  


if (inArrayInt(42, myArray, 100))
   //returned true
于 2012-06-27T10:43:45.127 に答える