Программа вылетает при вызове free - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Решил начать с написания простой программы, реализующей простенький калькулятор, использующий ОПЗ. При реализации стека возникла сложность. Программа вылетает при вызове free, что не так подскажите:
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;
    }
}
Подозреваю, что напортачил с указателями. PS старался следовать C99.

Решение задачи: «Программа вылетает при вызове 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();
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы: stdlib.h, conio.h, и собственный файл со структурой данных.
  2. Определяется структура данных oper_t содержащая указатель на следующий элемент в связном списке и символ операции.
  3. Объявляется статическая переменная head типа указатель на первый элемент связного списка.
  4. Реализуется функция pop, которая извлекает верхний элемент из связного списка и возвращает его символ.
  5. В функции main выделяется память под связный список, инициализируется его первый элемент.
  6. Вызывается функция pop для извлечения и удаления первого элемента связного списка.
  7. Выводится символ извлеченного элемента.
  8. Вызывается функция pop для извлечения и удаления второго элемента связного списка.
  9. Выводится символ извлеченного элемента.
  10. Вводится символ, но программа завершается раньше, чем он может быть обработан.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5
Похожие ответы