访问struct中的数组中的数据时出错

时间:2014-11-30 10:44:25

标签: c arrays struct

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

为了做到这一点,我为歌曲和艺术家制作了结构:

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);
    }
}

如您所见,我在此处打印出身份证号码。 对于当前添加的歌曲和歌曲中的第一首歌曲都是如此。 (用于调试) 这就是问题所在。

打印next-&gt; 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

欢迎任何帮助。

在此之后,我尝试将此歌曲添加到具有ID,此歌曲播放及其中歌曲数量的播放列表结构中。

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

*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);

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


[评论更新]

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

1 个答案:

答案 0 :(得分:1)

你真的在这里过于复杂。我假设songArray被声明为struct song* songArray?在这种情况下,songArray[0]会返回struct song,而不是struct song*。在这种情况下,您只需要songArray[0].id