Подсчитать количество элементов массива - C (СИ)
Формулировка задачи:
Решение задачи: «Подсчитать количество элементов массива»
#include <stdio.h>
#include <stdlib.h>
struct array;
typedef struct array array;
struct array {
void *data; // данные
size_t size; // кол-во элементов
size_t isize; // размер элемента
};
void* array_init(array*, size_t, size_t);
void* array_resize(array*, size_t);
void array_destroy(array*);
int main(void) {
array a; // динамический массив
int *ptr; // указатель на данные в массиве
int var; // переменная для ввода значения
size_t count; // количество введенных элементов
// создаем массив для 64х элементов типа int
ptr = array_init(&a, 64, sizeof(int));
if(NULL != ptr) { // если удалось создать
count = 0;
// вводим элементы, пока они есть на входе
while(fscanf(stdin, "%d", &var) == 1) {
if(var < 0) // условие окончания ввода
break;
if((count+1)>=a.size) { // массив заполнен
// увеличиваем размер
int * tmp = array_resize(&a, a.size + a.size);
if(tmp) {
ptr = tmp;
}
else // увеличить не удалось
break;
}
ptr[count] = var; // запоминаем введеное значение
++count;
}
fprintf(stdout, "You enter %ud elements\n", count);
array_destroy(&a); // удаляем массив
}
return EXIT_SUCCESS;
}
void* array_resize(array *self, size_t size) {
void* ptr = NULL;
if(self->size != size) {
if(self->data) {
ptr = realloc(self->data, size*self->isize);
if(NULL == ptr)
if(0 != size)
return NULL;
self->data = ptr;
self->size = size;
}
else {
if(size) {
ptr = calloc(size, self->isize);
if(ptr) {
self->data = ptr;
self->size = size;
}
}
}
}
return ptr;
}
void* array_init(array *self, size_t size, size_t isize) {
self->data = calloc(size, isize);
if(self->data) {
self->size = size;
self->isize = isize;
}
return self->data;
}
void array_destroy(array* self) {
if(self->data) {
free(self->data);
self->data = NULL;
self->size = 0;
self->isize = 0;
}
}
Объяснение кода листинга программы
В данном коде реализована функция main, которая создаёт динамический массив типа array, заполняет его данными, полученными от пользователя, выводит количество введенных элементов, а затем освобождает память, выделенную под массив.
Структура array содержит указатель data на данные в массиве, переменную size для хранения количества элементов и переменную isize для хранения размера одного элемента в массиве.
Функция array_init выделяет память под массив заданного размера и возвращает указатель на первый элемент массива. Если выделение памяти не удалось, функция возвращает NULL.
Функция array_resize изменяет размер массива, перераспределяя память под массив заданного размера. Если выделение памяти под новый массив не удалось, функция возвращает NULL.
Функция array_destroy освобождает память, выделенную под массив.
В функции main создается массив для 64 элементов типа int. Затем в цикле while пользователь вводит числа, пока не введет отрицательное число (что означает конец ввода). Если массив заполнен (т.е. количество введенных элементов равно размеру массива), то функция array_resize увеличивает размер массива на 64. Если выделение памяти под новый массив не удалось, то цикл прерывается.
После ввода всех чисел выводится сообщение о количестве введенных элементов, а затем вызывается функция array_destroy, которая освобождает память, выделенную под массив.