我正在尝试制作一个程序,以便为学校作业创建播放列表。

为此,我为歌曲和艺术家制作了结构:

struct song {
    int id;     /* unique identity of the song                      */
    char name[40];      /* name of song                             */
    int duration;       /* duration in seconds                          */
    artist* artist;     /* pointer to artist                            */
};

struct artist {
    int id;     /* unique identity of artist                        */
    char name[30];      /* name of artist (could be a band as well)             */
    song* songList;     /* pointer to array containing all songs from this artist   */
    int amountSongs;
};


然后,我从文件中读取有关此信息的信息,以获取所有歌曲和所有艺术家的指针数组。

这一切正常。

然后,我尝试创建一个播放列表,我要求用户输入他想要添加到播放列表中的歌曲的ID,并为该歌曲检索指向该歌曲的正确指针:

printf("Type the ID of the song that you want to add\n");
int inputID;
scanf("%i", &inputID);

for(i=0;i<(*numberOfSongs);i++){
    if (inputID==((*song_ptr)+i)->id){
        printf("Song is found!!!!!\n\n");

        songArray  = realloc((songArray ), ((numberSongsInPlaylist) + 1) * sizeof(struct song));
        struct song *next = songArray  + (numberSongsInPlaylist);
        next = ((*song_ptr)+i);
        numberSongsInPlaylist++;

        printf("%i  \n", next->id);
        printf("%i  \n", (*songArray[0]).id);
    }
}


如您所见,我在这里打印了ID号。
当前添加的歌曲和Songarray中的第一首歌曲。 (用于调试)
这是问题所在。

第一个打印出next-> id的打印正确的值,第二个打印出似乎是地址的内容。

我尝试了几件事,但没有任何一项工作,因此,我为什么希望这里的人可以帮助我解决这个问题,以下是我尝试过的事情:

printf("%i  \n", (**songArray[0]).id);     //invalid type unary '*' //does not compile
printf("%i  \n", &(*songArray[0]).id);     //Prints address (I think, value changes with each run)
printf("%i  \n", (*songArray).id);         //Error: request for member 'id' in something not a structure or union
printf("%i  \n", (*songArray)->id);        //Prints address


欢迎您提供任何帮助。

之后,我尝试将这个songarray添加到具有ID,这个songArray和其中歌曲数量的播放列表结构中。

我在以下代码中执行此操作,并在播放列表中打印了值:

*playlist_ptr  = realloc((*playlist_ptr ), ((*numberOfPlaylists) + 1) * sizeof(struct playlist));
struct playlist *nextPlay = *playlist_ptr  + (*numberOfPlaylists);

nextPlay->id = numberOfPlaylists;
nextPlay->numberOfSongs = numberSongsInPlaylist;
nextPlay->songs = songArray;
printf("song ID %d\n\n", ((*playlist_ptr) + 0)->songs[0]->id);


这将打印与第二个打印语句相同的值。这让我想知道问题是否出在songArray中的数据存储中,但是我找不到错误。



[评论更新]

实际上,它[songArray]被声明为struct song **songArray = NULL;

最佳答案

您在这里确实让这个问题变得过于复杂。我假设songArray被声明为struct song* songArray?在这种情况下,songArray[0]返回一个struct song,而不是struct song*。在这种情况下,您只需要songArray[0].id

09-25 21:27