Подсчитать количество элементов в массиве в C

Как я могу получить количество элементов, присутствующих в целочисленном массиве в C после того, как массив передан функции? Следующий код не работает.

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

3 ответа

В C вы можете получить только размер статически распределенных массивов, т.е.

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

дал бы 10.

Если ваш массив объявлен или передан как int* array, нет способа определить его размер, учитывая только этот указатель.

Скорее всего, вы делаете это внутри функции, которой вы передаете массив.
Массив исчезает как указатель на первый элемент, поэтому вы не можете сделать это внутри вызываемой функции.

Выполните этот расчет перед вызовом функции и передайте размер в качестве аргумента функции.

Вы делаете это неправильно. Я попытаюсь объяснить, используя небольшой пример кода. Объяснение в комментариях к коду:

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 чтобы найти, сколько элементов в массиве. Правильный способ сделать это состоит в том, чтобы иметь одну (или две) переменные для отслеживания размера.

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!
    }
}
Другие вопросы по тегам