简体   繁体   中英

Writing to a linked lists with nested structs

I am trying to write a function that can read some info from a file into a node in a doubly linked list. The format for the each nodes data is as follows.

struct(named record)
artist
album
song
genre
songLength(This is another struct that contains mins and secs)
playcount
rating

void load(FILE *file, Node *head)
{
    char tempArtist='\0', tempAlbum='\0', tempTitle='\0', tempGenre='\0'
    ,tempSpace='\0',tempMins='\0',tempSecs='\0';
    SongLength *tempLength=NULL;
    int tempPlay=0, tempRating=0,test=0;
tempLength = (SongLength*)malloc(sizeof(SongLength));

    fscanf(file,"%s",&tempArtist);
    fscanf(file,"%s",&tempAlbum);
    fscanf(file,"%s",&tempTitle);
    fscanf(file,"%s",&tempGenre);
    fscanf(file,"%s",&tempMins);
    fscanf(file,"%s",&tempSecs);
    fscanf(file,"%s",&tempPlay);
    fscanf(file,"%s",&tempRating);
    fscanf(file,"%s",&tempSpace);

    tempLength->mins=tempMins; 
    tempLength->secs=tempSecs;

    head->data->album=tempAlbum; // breaks here
    head->data->artist=tempArtist;
    head->data->genre=tempGenre;
    head->data->song=tempTitle;
    head->data->length=tempLength;
    head->data->played=tempPlay;
    head->data->rating=tempRating;

}

This is my current load function. When attempting to store these values in to nodes data I get an access violation.

Here are my structs for easy reproduction

typedef struct songlength
{
    int mins;
    int secs;
}SongLength;


typedef struct record
{
    char artist;
    char album;
    char song;
    char genre;
    struct songlength *length;
    int played;
    int rating;

}Record;

typedef struct node
{
    struct node *pPrev;
    struct node *pNext;
    struct record *data;

}Node;

makeNode

Node *makeNode(Record *newData)
{
    Node *temp = NULL;

    temp=(Node*)malloc(sizeof(Node));

    temp->data=newData;
    temp->pNext=NULL;

    return temp;
}

If any confusion arises just let me know! Also this is my first experience with dynamic memory so be gentle :P

Thanks!

These lines are not right.

fscanf(file,"%s",&tempArtist);
fscanf(file,"%s",&tempAlbum);
fscanf(file,"%s",&tempTitle);
fscanf(file,"%s",&tempGenre);
fscanf(file,"%s",&tempMins);
fscanf(file,"%s",&tempSecs);
fscanf(file,"%s",&tempPlay);
fscanf(file,"%s",&tempRating);
fscanf(file,"%s",&tempSpace);

They will definitely lead to undefined behavior because of the way the variables are defined.

You cannot expect

char c = '\0';
fscanf(file, "%s", &c);

to work. There isn't enough memory at &c to read a string. You need something like:

char s[100]; // Or some size that is large enough to hold the data
             // you are about to read.
fscanf(file, "%99s", s); // Make sure that you don't read more than 99
                         // characters. Leave at least one character
                         // for the terminating null character.

I hope that gives you enough clues on how to change your variables.

You did not assign memory for the variable tempLength to point to.

Add this before accessing the elements

SongLength *tempLength = malloc(sizeof(struct(SongLength));

EDIT

I'm just giving an overall idea how to allocate and use nested structs for your case

Node *head;
Record *r=malloc(sizeof(struct record));
SongLength *s=malloc(sizeof(struct songlength));
r->length=s;//<----- 1
r->length->mins=10;//Now you can assign values

head=malloc(sizeof(struct node));
head->pPrev=NULL;
head->pNext=NULL;
head->data=r;//<--- The length member inside record is already assigned memory in 1

head->data->artist='c';
head->data->length->mins=10;//assign

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM