Давайте разберемся с этим в порядке выполнения.
fflush(stdin);
- это неопределенное поведение .Если вам действительно нужно очистить все в stdin, вы должны найти другой путь (например, цикл).Существуют компиляторы / системы с определенной реализацией, но я бы не стал на это рассчитывать.
string++;
излишне, поскольку вы перезаписываете string
после цикла.
realloc(string, (counter)*sizeof(char));
должно быть
char *temp = realloc(string, (counter)*sizeof(char));
if (temp != NULL)
string = temp;
Таким образом, вы получите указатель, где находится ваш новый string
, но я предлагаю вам прочитать ссылку на realloc
.По сути, вы не знаете, был ли он перемещен, и старый адрес может быть недействительным с этого момента.Так что разыменование это также неопределенное поведение.
После этого вам придется вернуть новый адрес string
или передать адрес указателя вашей функции.
Та же проблема повторяется свторой realloc
.Вы только узнали, что ваш первый звонок был неправильным, потому что второй звонок заметил, что у вас нет действительных данных в том, что, по вашему мнению, будет вашим string
.
Что касается вашего комментария:невозможно использовать realloc
и быть уверенным, что перераспределенная память находится в том же месте, что и раньше.