2015-10-18 2 views
0

Я читал об этом, и я предполагаю, что получаю эту ошибку из-за того, что не выделял указатель перед его использованием в моей программе. Это так? Как я буду делать это, если это так? (ДОМАШНЯЯ)Сегментация Неисправность при печати объектов Struct

Struct находится в файле data.h

typedef struct student 
{ 
    char *firstName; 
    char *lastName; 
    int GPA; 
    float tuitionFees; 
    int numClass; 
}Student; 

Это находится в файле с именем student.c

Student Student_create() 
    { 

     Student *myStudent = malloc(sizeof(Student)); 
     assert(myStudent != NULL); 

     printf("Please enter a name: "); 
     scanf("%20s",myStudent->firstName); 
     printf("\nPlease enter a family name: "); 
     scanf("%20s",myStudent->lastName); 
     printf("\nEnter number of enrolled classes: "); 
     scanf("%d",&myStudent->numClass); 
     printf("\nEnter students GPA: "); 
     scanf("%d",&myStudent->GPA); 
     printf("\nEnter tuition Fee: "); 
     scanf("%f",&myStudent->tuitionFees); 

     return myStudent; 
    } 

    void Student_print(Student *who) 
    { 
     fflush(stdout); 
     printf("First Name: %s\n, ",who->firstName); 
     printf("Last Name: %s\n", who->lastName); 
     printf("\tTuition Fees: %f\n, ",who->tuitionFees); 
     printf("Number of Courses: %d\n , ",who->numClass); 
     printf("GPA : %d\n, ",who->GPA); 
    } 

И основной файл я пытаюсь получить к нему доступ через помечена col_personal.c

int main(int argc, char *argv[]) 
    { 

     //This is for the input 
     int choice; 
     mainMenu(); 


     return 0; 
    } 




void mainMenu() 
{ 
    int choice = 0; 
    Student class[10]; 
    int ssize = 0; 
    while(choice != 10){ 
    printf("\n\n\n\t\t\t====School Database====\n"); 
     printf(" 1. Add a new record\n"); 
     printf(" 2. Print Students.\n"); 
     scanf("%d",&choice); 

     //CHOICE ADD NEW RECORD. 
     if(choice == 1) 
     { 

     printf("1.Student\n"); 
     fflush(stdin); 
     scanf("%d",&choice); 
      if(choice == 1){ 
      printf("How many students would you like to input? "); 
      scanf("%d",&choice); 
      //Creates Students 
       for(int i=0; i<choice;i++){ 
        class[i] = Student_create(); 
        ssize = ssize + 1; 
       } 

      } 


     //PRINTING STUDENTS CHOICE 2 
     } else if (choice == 2){ 
      for(int i=0; i < ssize;i++){ 
       Student_print(class[i]); 
      } 
+0

'char * firstName;' и 'char * lastName;' Кажется, у вас нет выделения, прежде чем вы попытаетесь отсканировать их в них :( –

+1

Не по теме, так как это вопрос «исправить мой багги» без какого-либо явного понимания с вашей стороны .... Вы должны скомпилировать все предупреждения & debug info ('gcc -Wall -Wextra -g'), используйте отладчик (' gdb') и, возможно, [valgrind] (http://valgrind.org/) и [ASAN] (https: //en.wikipedia .org/wiki/AddressSanitizer) и прочитайте документацию по стандартным функциям, которые вы используете ('printf':' \ n' должен быть в конце строки управления; 'scanf': вы должны проверить количество отсканированных объектов) –

+0

Могу ли я передать класс [i] = Student_create(), так? – Genesis

ответ

1
  1. сегментации falut я s из-за отсутствия выделения памяти для указателей

char *firstName; char *lastName;

это просто указатели не указывают на любое действительное место памяти. pointer = malloc(<number of character to store> * sizeof(char));

Также освободите выделенную память к концу, чтобы избежать утечки памяти.

+0

В настоящее время я работаю со студентами, так что это все, что нужно сделать только для заполнителей. Как я могу заставить их указывать на правильную ячейку памяти? Malloc? – Genesis

+1

yes выделите память до используя указатель. using malloc –

+0

Должен ли я malloc их внутри моего Student_cre функция? – Genesis

Смежные вопросы