2015-03-10 2 views
0

Мне трудно понять, что я здесь делаю неправильно. Я делаю программу для организации базы данных книг. Я использую связанный список для сохранения структур книги в память. Когда дело доходит до ввода информации книги, я получаюУказатели - ошибка сегментации (ядро сбрасывается)

ошибку сегментации (ядро сбрасывали)

после ввода первого значения, идентификатор книги. В моей функции AddBook я создаю структуру temp book (aBook). Затем я попрошу пользователя ввести идентификатор для новой книги, затем попытаться сохранить его в атрибут идентификатора aBook. Здесь происходит ошибка.

В любом случае, я включил верхнюю часть моей программы, где я включаю библиотеки, объявляю функции и т. Д., А также включил функцию меню и функцию сложения, поэтому, надеюсь, кто-то может определить, что моя ошибка. Заранее спасибо.

верхней части моего кода:

//Libraries 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdbool.h> 

//only 10 books maximum 
#define MAX 10; 

//function prototypes 
void fileInput(); 
void menuSystem(); 
int writeAndCloseFile(); 

void addBook(); 
void takeOutBook(); 
void returnBook(); 
void deleteBook(); 
void viewAllBooks(); 
void viewBook(); 
void viewYearCollection(); 
int exitSystem(); 

bool isEmpty(); 

//The File 
FILE *fp; 

//LinkedList Initialization 
struct bookData { 

    //book variables 
    char* identifier; 
    char* title; 
    char* author; 
    int year; 
    bool status; 
    char* customer; 
    int timesTakenOut; 
    char* genre; 

}; 

//struct for one node 
struct node { 

    struct bookData *element; 
    struct node *next; 

}; 

//first and last nodes 
struct node *firstBook = NULL; 
struct node *lastBook = NULL; 

функции меню и функции AddBook (где происходит ошибка):

//MENU SYSTEM FUNCTION 
void menuSystem() 
{ 
     int chosenOption = 0; 

     printf("****************\n\n"); 
     printf("  MENU\n\n"); 
     printf("****************\n\n"); 

     printf("1 - Add book\n"); 
     printf("2 - Take out book\n"); 
     printf("3 - Return book\n"); 
     printf("4 - Delete book\n"); 
     printf("5 - View all books\n"); 
     printf("6 - View book\n"); 
     printf("7 - View Year Collection\n"); 
     printf("8 - Exit\n\n"); 

     printf("Chosen Option: "); 
     scanf("%d", &chosenOption); 

     //1. ADD BOOK 
     if(chosenOption == 1) 
     { 
      addBook(); 
     }else if(chosenOption == 2){ 
     //2. TAKE OUT A BOOK 
      takeOutBook(); 
     }else if(chosenOption == 3){ 
     //3. RETURN A BOOK 
      returnBook(); 
     }else if(chosenOption == 4){ 
     //4. DELETE A BOOK 
      deleteBook(); 
     }else if(chosenOption == 5){ 
     //5. VIEW ALL BOOKS 
      viewAllBooks(); 
     }else if(chosenOption == 6){ 
     //6. VIEW A BOOK 
      viewBook(); 
     }else if(chosenOption == 7){ 
     //7. VIEW YEAR COLLECTION 
      viewYearCollection(); 
     }else if(chosenOption == 8){ 
     //8. EXIT SYSTEM 
      printf("\n\nGoodbye!\n\n\n\n"); 
      exitSystem(); 
     } 
    } 


void addBook(){ 

    printf("\n*** ADDING BOOKS ***\n"); 

    struct node *aBookNode; 
    struct bookData *aBook; 

     aBook = (struct bookData *)malloc(sizeof(struct bookData)); 

     if (aBook == NULL) 
      printf("Error - no space for new book data\n\n\n"); 
     else 
     { 
      //INPUT BOOK INFO 

      //Identifier 
      printf("\nIdentifier(####-####): "); 
      scanf("%9s", aBook->identifier); 
      fflush(stdin); 

      //Title 
      printf("Title: "); 
      scanf("%s", aBook->title); 

Выход консоли (После того как я введен случайное число для идентификатора) :

Could not open the file book.dat 

****************** The database is empty. Books will need to be manually entered ****************** 






*** ADDING BOOKS *** 

Identifier(####-####): 1234-1234 
Segmentation fault (core dumped) 

ответ

2

вы выделить bookData структуру, но не выделяют м emory для строк внутри структуры.

Итак, когда вы спрашиваете scanf, напишите aBook->identifier, он напишет в случайном месте, и вы получите undefined behavior и сбой.

Либо объявлять те элементы, которые должны быть строками, как массивы фиксированного размера, или выделять память для строк.

+0

Я поменял их на массивы фиксированного размера, и все получилось. Большое спасибо за помощь. – user636363

2
scanf("%9s", aBook->identifier); 

Вам необходимо зарезервировать место для aBook->identifier и aBook->title, простой способ использует strdup (не является частью стандарта, но он доступен во многих реализациях):

char temp[10]; 

scanf("%9s", temp); 
aBook->identifier = strdup(temp); 
if (aBook->identifier == NULL) { /* Always check the return of strdup */ 
    perror("strdup"); 
    exit(EXIT_FAILURE); 
} 

Не забудьте для вызова free(aBook->identifier); в конце.

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