Программа из 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, если список пуст.