Блоки кода запускают мой код и выдают требуемый вывод, но затем говорят, что link.exe перестал работать - PullRequest
0 голосов
/ 31 марта 2020

Я запустил этот код на кодовых блоках, и он дает мне правильный вывод, но затем говорит, что link.exe перестал работать. Я не могу понять, почему, хотя код работает нормально. Я попытался исправить все проблемы в нем, потому что сначала он вообще не работал, теперь он работает и выдает результат, и происходит эта странная вещь. Как видно из кода, это простое задание, в котором я определяю структуру имени и возраста ученика, затем сканирует количество учеников, затем сканирует возраст и имя каждого ученика, создавая структуру для каждого, выделяя пространство в памяти и связывая все затем структуры распечатывают список и освобождают память.

[1]: https://i.stack.imgur.com/kuG14.png

   #include <stdio.h>
#include <stdlib.h>
struct student {
         char name[50];
         int age;
         struct student* next;
};
struct student * createStudent(char[] ,int);
void createString (struct student *,char []);
struct student * append (struct student *,struct student *);
void print(struct student *);
void freeS(struct student *);

int main (void){
                     int n,stage;
                     char stname[50];
                     struct student * start,*end ,*newp;
                     scanf("%d",&n);
                     for (int i=0;i<n;i++){
                        scanf("%s %d",stname,&stage);
                        newp=createStudent(stname,stage);
                        if (i==0) {
                            start=newp;
                            end=newp;
                        } else {
                            end = append(end,newp);
                        }
                     }
                     print(start);
                     freeS(start);
}
struct student * createStudent(char n[] ,int x){
          struct student *ptr;
          ptr = (struct student*)malloc(sizeof(struct student));
          ptr->age=x;
          ptr->next= NULL;
          createString(ptr,n);
          return (ptr);
};
void createString(struct student* point,char name[]){

          for(int i=0;i<50;i++){
            point->name[i]=name[i];}
}
struct student * append(struct student * end, struct student * newp){
         end->next=newp;
         return(newp);
};
void freeS(struct student* start){
          struct student * tmp;
            tmp=start;
          while (start!=NULL){
            start=tmp;
            free(start);
            tmp=tmp->next;
          }
}
void print(struct student* start){
          int i = 1;
          while (start!=NULL){
            printf("The Student num%d's name is:%s\n Age is:%d \n",i,start->name,start->age);
            start=start->next;
            i++;
          }
}

1 Ответ

0 голосов
/ 31 марта 2020

Возможно, проблема здесь в вашем freeS коде.

tmp=start;
while (start!=NULL){
    start=tmp;
    free(start);
    tmp=tmp->next;
}

В последней строке разыменовывается память, которая была только что освобождена.

Код должен быть примерно таким:

while (start != NULL) {
    tmp = start->next;
    free(start);
    start = tmp;
}
...