web-dev-qa-db-ja.com

Cの配列内の要素の数を数えます

配列が関数に渡された後、Cの整数配列に存在する要素の数を取得するにはどうすればよいですか?次のコードは機能しません。

size=sizeof(array)/sizeof(array[0]);
5
user2266758

Cでは、静的に割り当てられた配列のサイズのみを取得できます。

int array[10];
size = sizeof(array) / sizeof(int);

10を与えるでしょう。

配列がint* arrayとして宣言または渡された場合、このポインターのみを指定すると、そのサイズを決定する方法はありません。

15
Elmar Peise

ほとんどの場合、配列を渡す関数内でこれを実行します。
配列は最初の要素へのポインタとして減衰するため、呼び出された関数内でこれを行うことはできません。

関数を呼び出す前にこの計算を実行し、サイズを関数の引数として渡します。

11
Alok Save

あなたはそれについて間違った方法で進んでいます。小さなコード例を使用して説明しようと思います。説明はコードコメントにあります:

int array[100];
int size = sizeof(array) / sizeof(array[0]);  // size = 100, but we don't know how many has been assigned a value

// When an array is passed as a parameter it is always passed as a pointer.
// it doesn't matter if the parameter is declared as an array or as a pointer.
int getArraySize(int arr[100]) {  // This is the same as int getArraySize(int *arr) { 
  return sizeof(arr) / sizeof(arr[0]);  // This will always return 1
}

上記のコードからわかるように、配列に含まれる要素の数を見つけるためにsizeofを使用しないでください。それを行う正しい方法は、サイズを追跡するために1つ(または2つ)の変数を持つことです。

const int MAXSIZE 100;
int array[MAXSIZE];
int size = 0; // In the beginning the array is empty.

addValue(array, &size, 32);   // Add the value 32 to the array

// size is now 1.

void addValue(int *arr, int *size, int value) {
    if (size < MAXSIZE) {
        arr[*size] = value;
        ++*size;
    } else {
        // Error! arr is already full!
    }
}
1
Klas Lindbäck