Функция realloc
может перемещать память, которая была ранее выделена. После вызова возвращается указатель на выделенную память и значение указателя, переданное ему, если оно отличается, больше не действует. Поэтому, когда вы вызываете strcat(answer, tmp);
, вы потенциально пишете в освобожденную память, которая вызывает неопределенное поведение , и в этом случае это проявляется как странный вывод, который вы видите.
После проверки верните значение realloc
, присвойте это значение обратно answer
.
Кроме того, sizeof(answer)
и sizeof(tmp)
дают вам размер указателя, а не размер того, на что он указывает. Вместо этого вы хотите использовать strlen
, чтобы получить длину строки, а затем содержать. И пока мы это делаем, давайте просто добавим к этому 1 вместо 1000, потому что это все, что вам действительно нужно.
void *ptr = realloc(answer, strlen(answer) + strlen(tmp) + 1);
if (!ptr)
return -1;
answer = ptr;
strcat(answer, tmp);
Еще одна проблема: при первом вызове realloc
память полностью неинициализируется , Впоследствии вызов strcat
зависит от answer
, содержащего завершенную нулем строку. Это не так, это также вызывает неопределенное поведение.
Это может быть исправлено с помощью malloc
- для запуска одного байта и установки его в 0, таким образом, вы начинаете с пустой строки.
char *answer = malloc(1);
if (!answer) return -1;
answer[0] = 0;