fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct {
  6. size_t length;
  7. size_t capacity;
  8. int *data;
  9. } Array;
  10.  
  11. /*
  12.  * Удостоверяется, что в массиве есть место под указанное количество элементов.
  13.  * Перевыделяет память, если места недостаточно.
  14.  */
  15. static void array_require(Array *array, size_t required_length) {
  16. if (array->capacity < required_length) {
  17. // Выделяем с запасом.
  18. size_t new_capacity = required_length + required_length / 2;
  19. int *new_data = realloc(array->data, new_capacity * sizeof(*array->data));
  20. if (new_data) {
  21. // Обнуляем добавленные элементы.
  22. memset(new_data + array->capacity, 0, (new_capacity - array->capacity) * sizeof(*array->data));
  23. // Обновляем дескриптор массива.
  24. array->capacity = new_capacity;
  25. array->data = new_data;
  26. } else {
  27. fprintf(stderr, "no memory\n");
  28. exit(1);
  29. }
  30. }
  31. }
  32.  
  33.  
  34. int main(void) {
  35. Array array = { 0 };
  36.  
  37. array_require(&array, 10);
  38. for (size_t i = 0; i < 10; i++) {
  39. array.data[array.length++] = i * 100 + i;
  40. }
  41.  
  42. array_require(&array, 20);
  43. for (size_t i = 0; i < 20; i++) {
  44. printf("%zu: %i\n", i, array.data[i]);
  45. }
  46.  
  47. return 0;
  48. }
  49.  
Success #stdin #stdout 0s 2300KB
stdin
Standard input is empty
stdout
0: 0
1: 101
2: 202
3: 303
4: 404
5: 505
6: 606
7: 707
8: 808
9: 909
10: 0
11: 0
12: 0
13: 0
14: 0
15: 0
16: 0
17: 0
18: 0
19: 0