#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
	size_t length;
	size_t capacity;
	int *data;
} Array;

/*
 * Удостоверяется, что в массиве есть место под указанное количество элементов.
 * Перевыделяет память, если места недостаточно.
 */
static void array_require(Array *array, size_t required_length) {
	if (array->capacity < required_length) {
		// Выделяем с запасом.
		size_t new_capacity = required_length + required_length / 2;
		int *new_data = realloc(array->data, new_capacity * sizeof(*array->data));
		if (new_data) {
			// Обнуляем добавленные элементы.
			memset(new_data + array->capacity, 0, (new_capacity - array->capacity) * sizeof(*array->data));
			// Обновляем дескриптор массива.
			array->capacity = new_capacity;
			array->data = new_data;
		} else {
			fprintf(stderr, "no memory\n");
			exit(1);
		}
	}
}


int main(void) {
	Array array = { 0 };
	
	array_require(&array, 10);
	for (size_t i = 0; i < 10; i++) {
		array.data[array.length++] = i * 100 + i;
	}
	
	array_require(&array, 20);
	for (size_t i = 0; i < 20; i++) {
		printf("%zu: %i\n", i, array.data[i]);
	}
	
	return 0;
}
