У меня есть ошибка в моей программе, когда я выполняю остановку кода, я пытался его отладить, и у меня был этот поток сообщений 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;
}
(student)malloc(sizeof(student));
Это malloc
неправильно. student
— это тип указателя, поэтому вы выделяете достаточно места для хранения одного указателя, в то время как вам нужно достаточно места для хранения одного struct s
.
Не убирайте typedef
указатель. Он укусит вас.
Правильный вызов
(struct s *)malloc(sizeof(struct s))
Обратите внимание, что в выражении есть только один *
.
Есть много других серьезных проблем с кодом, но они не вызывают сразу сбоев.
Хороший улов. Это еще раз показывает, что определение типов указателей (например, typedef struct s *student;
) — очень плохая идея и только вызывает путаницу. Кстати, бросок с malloc бесполезен.
@н.м. Да, не заметил, в следующий раз я никогда не наберу указатель, но все равно сбой все еще там
@Henri Пожалуйста, используйте отладчик, чтобы получить больше информации. К сожалению, это не бесплатный интерактивный сеанс отладки.
Комментарии перемещены в чат ; пожалуйста, не продолжайте обсуждение здесь. Прежде чем публиковать комментарий под этим, пожалуйста, ознакомьтесь с целями комментариев . Комментарии, которые не требуют разъяснений или предложений по улучшению, обычно относятся к ответу , к Meta Stack Overflow или в чату переполнения стека. Комментарии, продолжающие обсуждение, могут быть удалены.