Не существует некрасивого решения для чистого C.
#include <stdio.h>
int main() {
int i;
size_t space = 1; // initial room for string
char* characters = malloc(space); // allocate
for (i = 0; i < 7; i++) {
characters[i] = (char)('a' + i);
space++; // increment needed space by 1
characters = realloc(characters, space); // allocate new space
if (i > 2) {
break;
}
}
for (i = 0; i < 7; i++) {
printf("%c\n", characters[i]);
}
return 0;
}
На практике вы хотите избежать использования realloc и, конечно, выделять память большими блоками, чем один байт, возможно дажеэкспоненциальная скорость.Но по сути это то, что происходит под капотом std :: string и тому подобного: вам нужен счетчик, который подсчитывает текущий размер, переменную текущего максимального размера (здесь это всегда текущий размер + 1, для простоты) инекоторое перераспределение, если потребность в пространстве превышает максимальный размер тока.