Программа из 20 строк, синтаксических ошибок нет, но из консоли вылетает. В чем ошибка? - C (СИ)
Формулировка задачи:
#include<stdio.h> #include<malloc.h> typedef struct sp{ struct el *info; struct sp *link; }sp; typedef struct el{ int str; struct sp *next; }el; int main(){ int a; sp *head; head=NULL; printf("Vvod\n"); scanf("%d",&a); head=(sp*)malloc(sizeof(sp)); head->info->str=a; printf("Otvet\n%d", head->info->str); return 0; }
Решение задачи: «Программа из 20 строк, синтаксических ошибок нет, но из консоли вылетает. В чем ошибка?»
textual
Листинг программы
#include<stdio.h> #include<malloc.h> typedef struct sp{ struct el *info; struct sp *link; }sp; typedef struct el{ int str; struct sp *next; }el; int main(){ int a; sp *head; head=NULL; printf("Vvod\n"); scanf("%d",&a); head=(sp*)malloc(sizeof(sp)); head->info=(el*)malloc(sizeof(el)); head->info->str=a; printf("Otvet\n%d", head->info->str); return 0; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы: iostream.h и malloc.h.
- Объявляем структуру данных типа
связный список
с именемsp
. - Внутри структуры
sp
объявляем указательinfo
на структуруel
и указательlink
на следующий элемент спискаsp
. - Объявляем структуру данных типа
элемент
с именемel
. - Внутри структуры
el
объявляем переменнуюstr
типа int и указательnext
на следующий элемент спискаel
. - В функции main() объявляем переменную
a
типа int, указательhead
на первый элемент спискаsp
и инициализируем его значением NULL. - Выводим сообщение
Vvod
. - Считываем значение переменной
a
с помощью функции scanf(). - Выделяем память под новый элемент списка
sp
с помощью функции malloc(). - Получаем указатель на новый элемент списка
sp
и присваиваем его значение указателюhead
. - Выделяем память под новый элемент списка
el
с помощью функции malloc(). - Получаем указатель на новый элемент списка
el
и присваиваем его значение полюinfo
текущего элемента спискаsp
. - Выводим сообщение
Otvet
. - Выводим значение поля
str
текущего элемента спискаel
с помощью функции printf(). - Возвращаем значение 0, что означает успешный конец работы программы.
- В коде нет обработки ошибок, в частности, не проверяется успешность выделения памяти с помощью функций malloc() и scanf().
- Код не содержит цикла для прохода по всем элементам списка
sp
и вывода их значений. - Код не содержит инструкции для освобождения выделенной памяти.
- Присутствует потенциальная ошибка сегментации, связанная с некорректным использованием указателя
link
внутри цикла. - Присутствует потенциальная ошибка сегментации при попытке доступа к полю
next
элемента спискаel
, если список пуст.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д