#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 {
}
}
}
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;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdHlwZWRlZiBzdHJ1Y3QgewoJc2l6ZV90IGxlbmd0aDsKCXNpemVfdCBjYXBhY2l0eTsKCWludCAqZGF0YTsKfSBBcnJheTsKCi8qCiAqINCj0LTQvtGB0YLQvtCy0LXRgNGP0LXRgtGB0Y8sINGH0YLQviDQsiDQvNCw0YHRgdC40LLQtSDQtdGB0YLRjCDQvNC10YHRgtC+INC/0L7QtCDRg9C60LDQt9Cw0L3QvdC+0LUg0LrQvtC70LjRh9C10YHRgtCy0L4g0Y3Qu9C10LzQtdC90YLQvtCyLgogKiDQn9C10YDQtdCy0YvQtNC10LvRj9C10YIg0L/QsNC80Y/RgtGMLCDQtdGB0LvQuCDQvNC10YHRgtCwINC90LXQtNC+0YHRgtCw0YLQvtGH0L3Qvi4KICovCnN0YXRpYyB2b2lkIGFycmF5X3JlcXVpcmUoQXJyYXkgKmFycmF5LCBzaXplX3QgcmVxdWlyZWRfbGVuZ3RoKSB7CglpZiAoYXJyYXktPmNhcGFjaXR5IDwgcmVxdWlyZWRfbGVuZ3RoKSB7CgkJLy8g0JLRi9C00LXQu9GP0LXQvCDRgSDQt9Cw0L/QsNGB0L7QvC4KCQlzaXplX3QgbmV3X2NhcGFjaXR5ID0gcmVxdWlyZWRfbGVuZ3RoICsgcmVxdWlyZWRfbGVuZ3RoIC8gMjsKCQlpbnQgKm5ld19kYXRhID0gcmVhbGxvYyhhcnJheS0+ZGF0YSwgbmV3X2NhcGFjaXR5ICogc2l6ZW9mKCphcnJheS0+ZGF0YSkpOwoJCWlmIChuZXdfZGF0YSkgewoJCQkvLyDQntCx0L3Rg9C70Y/QtdC8INC00L7QsdCw0LLQu9C10L3QvdGL0LUg0Y3Qu9C10LzQtdC90YLRiy4KCQkJbWVtc2V0KG5ld19kYXRhICsgYXJyYXktPmNhcGFjaXR5LCAwLCAobmV3X2NhcGFjaXR5IC0gYXJyYXktPmNhcGFjaXR5KSAqIHNpemVvZigqYXJyYXktPmRhdGEpKTsKCQkJLy8g0J7QsdC90L7QstC70Y/QtdC8INC00LXRgdC60YDQuNC/0YLQvtGAINC80LDRgdGB0LjQstCwLgoJCQlhcnJheS0+Y2FwYWNpdHkgPSBuZXdfY2FwYWNpdHk7CgkJCWFycmF5LT5kYXRhID0gbmV3X2RhdGE7CgkJfSBlbHNlIHsKCQkJZnByaW50ZihzdGRlcnIsICJubyBtZW1vcnlcbiIpOwoJCQlleGl0KDEpOwoJCX0KCX0KfQoKCmludCBtYWluKHZvaWQpIHsKCUFycmF5IGFycmF5ID0geyAwIH07CgkKCWFycmF5X3JlcXVpcmUoJmFycmF5LCAxMCk7Cglmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwOyBpKyspIHsKCQlhcnJheS5kYXRhW2FycmF5Lmxlbmd0aCsrXSA9IGkgKiAxMDAgKyBpOwoJfQoJCglhcnJheV9yZXF1aXJlKCZhcnJheSwgMjApOwoJZm9yIChzaXplX3QgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CgkJcHJpbnRmKCIlenU6ICVpXG4iLCBpLCBhcnJheS5kYXRhW2ldKTsKCX0KCQoJcmV0dXJuIDA7Cn0K