«поток 1 получил сигнал SIGTRAP, ловушка трассировки/точки останова», что это за ошибка?

У меня есть ошибка в моей программе, когда я выполняю остановку кода, я пытался его отладить, и у меня был этот поток сообщений 1, полученный сигнал SIGTRAP, ловушка трассировки/точки останова вот мой код:

#include <stdio.h>
#include <stdlib.h>
typedef struct s *student;
struct s{
    long long int code;
    char *name;
    short int age;
    float pass_mark;
    bool course;
    struct s *next;
};
student enroll(student head,long long int code1, char *name1,short int age1,bool course1){
    student p,q;
    if (head==NULL){
        head=(student)malloc(sizeof(student));
        head->code=code1;
        head->name=name1;
        head->age=age1;
        head->course=course1;
        head->next=NULL;
        
    }
    else{p=head;
        q=(student)malloc(sizeof(student));
        q->code=code1;
        q->name=name1;
        q->age=age1;
        q->course=course1;
        q->next=p;
        head=q;
    }
    return(head);
}
int main(){
    int x=0,b;
    student head=NULL,q=NULL;
    long long int code1;
    char name1[50];
    short int age;
    bool course1;
    do{
        
        printf("1.register new student. \n");
        printf("0.finish program.\n");
        printf("Enter the number of the task needed: ");
        scanf("%d",&x);
        if (x==1){
            
            printf("you chose 1: \n");
            printf("Enter the student code:");
            scanf("%lli",&code1);//code of student
            getchar();
            printf("Enter the student name");
            gets(name1);//name of student
            printf("Enter student age:");
            scanf("%hi",&age);//age of student
            printf("1-Math\n");
            printf("2-computer science");
            printf("\nEnter the number of the course: ");
            scanf("%d",&b);//number of the course
            while((b!=1)&&(b!=2)){
                printf("\nchose 1 or 2: "); 
                scanf("%d",&b);
            }
            if (b==1) course1=1; //math course
            if (b==2) course1=0; //computer science course
            head=enroll(head,code1,name1,age,course1); //fill student info 
            printf("-------------------------------------\n");
        }
}while(x!=0);
    
    return 0;
}

Я использовал связанные списки в этой программе, и дело в том, чтобы записать студентов на курс, а есть 2 курса: математика или CS, когда я зачисляю второго студента, произошла ошибка.

1.register new student.
0.finish program.
Enter the number of the task needed: 1
you chose 1:
Enter the student code:231
Enter the student name Peter
Enter student age:23
1-Math
2-computer science
Enter the number of the course: 1
-------------------------------------
1.register new student.
0.finish program.
Enter the number of the task needed: 1
you chose 1:
Enter the student code:232
Enter the student name Gary
Enter student age:38
1-Math
2-computer science
Enter the number of the course: 2

--------------------------------
Process exited after 39.01 seconds with return value 3221226356
Appuyez sur une touche pour continuer...

поэтому, когда я в первый раз ввел данные, проблем не было, но во второй раз мой код перестает выполняться.

Я новичок, поэтому, если кто-то может помочь мне с этим и объяснить мне это простым способом, я был бы признателен.

Обновление: вот программа после рекомендованных вами изменений. Кстати: мне трудно использовать fgets, и я не понимаю, почему это становится опасным, оно работает отлично

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct s student;
struct s{
    long long int code;
    char *name;
    short int age;
    float pass_mark;
    bool course;
    struct s *next;
};
student* enroll(student *head,long long int code1, char name1[50],short int age1,bool course1){
    student *p,*q;
        
        p=head;
        q=(student*)malloc(sizeof(student));
        q->code=code1;
        strcpy(q->name,name1);
        q->age=age1;
        q->course=course1;
        q->next=p;
        head=q;
        
    return(head);
}
int main(){
    int x=0,b;
    student *head=NULL,*q=NULL;
    long long int code1;
    char name1[50];
    short int age;
    bool course1;
    do{
        
        printf("1.register new student. \n");
        printf("0.finish program.\n");
        printf("Enter the number of the task needed: ");
        scanf("%d",&x);
        if (x==1){
            
            printf("you chose 1: \n");
            printf("Enter the student code:");
            scanf("%lli",&code1);//code of student
            getchar();
            printf("Enter the student name: ");
            fgets(name1,50,stdin);//name of student
            printf("%s",name1);
            printf("Enter student age:");
            scanf("%hi",&age);//age of student
            printf("%d",age);
            printf("1-Math\n");
            printf("2-computer science");
            printf("\nEnter the number of the course: ");
            scanf("%d",&b);//number of the course
            while((b!=1)&&(b!=2)){
                printf("\nchoose 1 or 2: "); 
                scanf("%d",&b);
            }
            if (b==1) course1=1; //math course
            if (b==2) course1=0; //computer science course
            head=enroll(head,code1,name1,age,course1); //fill student info 
            printf("%lli",head->code);
            printf("%s",head->name);
            printf("%d",head->age);
            printf("%d",head->course);
            printf("-------------------------------------\n");
        }
}while(x!=0);
    
    return 0;
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
(student)malloc(sizeof(student));

Это malloc неправильно. student — это тип указателя, поэтому вы выделяете достаточно места для хранения одного указателя, в то время как вам нужно достаточно места для хранения одного struct s.

Не убирайте typedef указатель. Он укусит вас.

Правильный вызов

(struct s *)malloc(sizeof(struct s))

Обратите внимание, что в выражении есть только один *.

Есть много других серьезных проблем с кодом, но они не вызывают сразу сбоев.

n. m. 30.03.2023 11:01

Хороший улов. Это еще раз показывает, что определение типов указателей (например, typedef struct s *student;) — очень плохая идея и только вызывает путаницу. Кстати, бросок с malloc бесполезен.

Jabberwocky 30.03.2023 11:03

@н.м. Да, не заметил, в следующий раз я никогда не наберу указатель, но все равно сбой все еще там

Henri 30.03.2023 13:05

@Henri Пожалуйста, используйте отладчик, чтобы получить больше информации. К сожалению, это не бесплатный интерактивный сеанс отладки.

n. m. 30.03.2023 13:18

Другие вопросы по теме