Если ваш входной буфер определен как 64 символа, то я бы рекомендовал использовать массив char
вместо char*
. Что-то вроде char input_buffer[65];
должно служить вашим целям (добавьте дополнительный символ для конечного '\0'
).
Что касается истории команд, вы можете использовать для этого двумерный массив. Что-то вроде char command_history[20][65];
должно позволить вам хранить 20 старых команд по 64 символа в каждой.
Статическое распределение этих буферов должно немного облегчить вам задачу, поскольку вам не придется беспокоиться о malloc
и друзьях.
Трудно дать вам слишком много конкретных советов, не видя ваш код. У меня такое чувство, что вы совершаете ошибки такого же типа, которые характерны для людей, впервые изучающих C. Можете ли вы опубликовать ту часть кода, которая вызывает у вас проблемы, чтобы мы могли больше узнать о том, что вы делаете?
Обновление после опубликованного кода:
Одна проблема, которую я вижу, состоит в том, что функция takeInput
не имеет оператора возврата. Когда вы используете input = takeInput();
внутри своей основной функции, значение input
не устанавливается на то, что вы думаете. Вероятно, это недопустимый указатель, из-за которого ваша строка с надписью input[j]
выходит на segfault.
Ваше использование cmdHistory
также нуждается в пересмотре. Вы выделяете его с помощью cmdHistory = (char**)calloc(21,sizeof(int));
, что дает вам достаточно места для хранения 21 целого числа. В функции printHistory
вы передаете элементы cmdHistory
в printw
, как если бы они были строками (они являются только целыми числами). Это определенно не делает то, что вы хотите, чтобы это было сделано. Вместо этого ваша логика распределения для cmdHistory
должна больше походить на вашу логику отмены распределения (кроме обратной). Выделите массив char**
, затем выполните итерацию по массиву, присваивая каждый указатель вновь выделенному буферу. Так же, как у вас есть один оператор free
для каждого элемента в массиве плюс free
для массива в целом, у вас должен быть один malloc
для каждого элемента плюс один malloc
для массива в целом.
Даже если вы не можете использовать статически распределенный стек, попробуйте написать свою программу, используя тот или иной. Это позволит вам избавиться от излишней логики обнаружения ключей и т. Д., Не беспокоясь о динамической части памяти программы. Когда все остальное заработает, вернитесь и замените статическую память для динамического выделения памяти. Таким образом, вам нужно только немного отладить за раз.