Решение проблемы
Проблема заключается в том, что вы резервируете память для sq
в качестве указателя .Почему это проблематично?
Ну, у нас есть место только для адреса до sqStack
.Если мы передаем sq
на init_stack()
, мы разыменовываем sq
.Это ни к чему не приводит, так как мы инициализировали его как указатель, и, таким образом, если мы попытаемся присвоить значения его полям, у нас не останется места для этого!
Как решить проблему?Просто инициализируйте sq
как sqStack
вместо указателя на него:
sqStack sq;
init_stack(&sq); /* pass by reference here */
/* code continued */
Предложение
Кроме того, я думаю, что лучше использовать struct
было бы
typedef struct sqStack {
int *elements;
int top;
}
Таким образом, вы можете использовать верх как средство для отслеживания размера вашего стека и просто хранить элементы в специально выделенном массиве.Нажатие будет выглядеть как
void push(sqStack *sq, int element) {
sq->top++;
if (sq->top - 1 == 0) {
/* we need to allocate space */
sq->elements = malloc(sizeof(int));
} else {
/* we need to reallocate space */
sq->elements = realloc(sq->elements, sq->top * sizeof(int));
}
sq->elements[sq->top - 1] = element;
}
... и аналогичным образом пересматривать другие функции.Но это только предположение.