Программа вылетает при вызове 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
для извлечения и удаления второго элемента связного списка. - Выводится символ извлеченного элемента.
- Вводится символ, но программа завершается раньше, чем он может быть обработан.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д