Программа вылетает при вызове free - C (СИ)
Формулировка задачи:
Решил начать с написания простой программы, реализующей простенький калькулятор, использующий ОПЗ.
При реализации стека возникла сложность.
Программа вылетает при вызове free, что не так подскажите:
Подозреваю, что напортачил с указателями.
PS старался следовать C99.
static struct oper_t *head = NULL;
//Вынуть верхний эл-т стека
char pop(){
char c;
struct oper_t *PTR;
if (head == NULL)
return '\0';
else {
//копируем в PTR указатель на верхний элемент стека
PTR=head;
//копируем выходной символ с вершины
c=PTR->c;
//устанавливаем новую вершину
head=PTR->next;
//освобождаем память
free(PTR);
return c;
}
}Решение задачи: «Программа вылетает при вызове free»
textual
Листинг программы
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
struct oper_t
{
char c;
oper_t* next;
};
static struct oper_t *head = NULL;
//Вынуть верхний эл-т стека
char pop(){
char c;
struct oper_t *PTR;
if (head == NULL)
return '\0';
else {
//копируем в PTR указатель на верхний элемент стека
PTR=head;
//копируем выходной символ с вершины
c=PTR->c;
//устанавливаем новую вершину
head=PTR->next;
//освобождаем память
free(PTR);
return c;
}
}
void main(void)
{
//head=new oper_t;
head=(oper_t*)malloc(sizeof(oper_t));
head->c='f';
//head->next=new oper_t;
head->next=(oper_t*)malloc(sizeof(oper_t));
head->next->c='d';
char a=pop();
printf("%c\n",a);
a=pop();
printf("%c\n",a);
getch();
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы: stdlib.h, conio.h, и собственный файл со структурой данных.
- Определяется структура данных
oper_tсодержащая указатель на следующий элемент в связном списке и символ операции. - Объявляется статическая переменная
headтипа указатель на первый элемент связного списка. - Реализуется функция
pop, которая извлекает верхний элемент из связного списка и возвращает его символ. - В функции
mainвыделяется память под связный список, инициализируется его первый элемент. - Вызывается функция
popдля извлечения и удаления первого элемента связного списка. - Выводится символ извлеченного элемента.
- Вызывается функция
popдля извлечения и удаления второго элемента связного списка. - Выводится символ извлеченного элемента.
- Вводится символ, но программа завершается раньше, чем он может быть обработан.