Это не имеет ничего общего с fork()
.
С справочной страницы из getline
:
Если * lineptr равен NULL, то getline() выделит буфер для хранения строки, который должен быть освобожден пользовательской программой.(В этом случае значение в * n игнорируется.)
Если буфер недостаточно велик для размещения строки, getline () изменяет его размер с помощью realloc (3), обновляя * lineptr и * n какобязательно.
Проблема в том, что вы назначаете адрес элементам массива.Наконец они все указывают на один и тот же адрес (зависит от getline
realloc
).Как вы не malloc
, так и getline
должен был сделать это внутри, и при последующих вызовах realloc
используется внутри getline
, который обычно сохраняет тот же адрес.Таким образом, по мере обновления вашего line
все элементы массива, вероятно, также будут обновлены, поскольку большинство элементов массива указывают на один и тот же адрес.
Итак, наконец, когда вы достигнете условия, когда ваш line
это "History"
, они просто показали, что line
содержало (то есть "История"), потому что все они указали на тот же адрес, что и line
.
Это основная причина проблемы, но fork()
наверняка отклонит вас от того, как вы хотите, чтобы ваш вывод впоследствии.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 10 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *]]]]]].вы делаете execvp()
, если fork() == 0
, это не должно вызывать проблем.Все, что вам нужно сделать, это:
history[history_size] = malloc(sizeof(char)* (strlen(line)+1));
strcpy(history[history_size++], line);
вместо прямого назначения.
2) Не забывайте free()
на каждой итерации память, выделяемую getline()
в line
.