Member 13476370 Ответов: 1

Scanf не на структуру, содержащую указатель на другую структуру


эта функция вставляет информацию о книге в структуру .. она работает хорошо, но при сканировании даты программа давит..Я много искал, но ничего не мог исправить

typedef struct
{
    char title[10];
    char author[10];
    char publisher[10];
    char ISBN[10];
    dateStruct* date;
    int copies;
    int current;
} book;
typedef struct
{
    int day;
    int month;
    int year;
} dateStruct;

book* insert(void)
{
   book* theInserted =(book*)malloc(1*sizeof(book));
   gets(theInserted->title);
   gets(theInserted->author);
   gets(theInserted->publisher);
   gets(theInserted->ISBN);
   scanf("%d%d",&(theInserted->copies),&(theInserted->current));
   scanf("%d%d%d",&(theInserted->date->day),&(theInserted->date->month),&(theInserted->date->year));
    return theInserted;
}


Что я уже пробовал:

вот тут-то что-то и идет не так:

scanf("%d%d%d",&(theInserted->date->day),&(theInserted->date->month),&(theInserted->date->year));

1 Ответов

Рейтинг:
9

Jochen Arndt

Вы должны выделить память для theInserted->date и освободите его, когда он больше не используется:

book* theInserted =(book*)malloc(sizeof(book));
theInserted->date = (dateStruct*)malloc(sizeof(dateStruct));

/* Use theInserted here */

/* Free memory */
free(theInserted->date);
free(theInserted);
Когда этого не происходит, то theInserted->date участник указывает на любое место, что приводит к нарушению доступа или просто сбою программы.

Лучшее решение состоит в том, чтобы сделать dateStruct члена нормальный член тип, а не указатель:
typedef struct
{
    char title[10];
    char author[10];
    char publisher[10];
    char ISBN[10];
    dateStruct date; // normal member and not pointer
    int copies;
    int current;
} book;

/* ... */

scanf("%d%d%d",&(theInserted->date.day),&(theInserted->date.month),&(theInserted->date.year));