Можно ли увеличить массив char
при его использовании, БЕЗ malloc
?
Быстрый ответ: Нет, невозможно увеличить размер массива без его перераспределения.
Забавный ответ: Не используйте malloc()
, используйте realloc()
.
Длинный ответ:
Если массив char
имеет статический или автоматический класс хранения, то, скорее всего, невозможно увеличить его размер во время выполнения, поскольку он хранится по тому же адресу, что потребует перемещения или перераспределения объектов, находящихся по более высоким адресам, в другое место. .
Если массив был получен с помощью malloc
, возможно, можно расширить его размер, если после него в памяти не было выделено никаких других объектов. Действительно, realloc()
в большем размере может вернуть тот же адрес. Проблема в том, что невозможно предсказать, и если realloc
возвращает другой адрес, текущее пространство было освобождено, поэтому указатели на него теперь недействительны.
Эффективный способ приступить к этому перераспределению состоит в геометрическом увеличении размера в 2 раза, 1,5 раза, 1,625 раза ..., чтобы минимизировать количество перераспределений и сохранить линейное время в качестве размера массив растет линейно. Вы бы изменили переменную для выделенного размера массива и количества символов, которые вы сохранили в нем.
Вот пример:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *a = NULL;
size_t size = 0;
size_t count = 0;
int c;
while ((c = getchar()) != EOF && c != '\n') {
if (count >= size) {
/* reallocate the buffer to 1.5x size */
size_t newsize = size + size / 2 + 16;
char *new_a = realloc(a, new_size);
if (new_a == NULL) {
fprintf("out of memory for %zu bytes\n", new_size);
free(a);
return 1;
}
a = new_a;
size = new_size;
}
a[count++] = c;
}
for (i = 0; i < count; i++) {
putchar(a[i]);
}
free(a);
return 0;
}