Ваша getSongInfo
функция не возвращает указатель, поэтому попытка поместить возвращаемое значение в переменную и затем освободить его бессмысленно. Указанные указатели находятся внутри struct songInfo
, в частности, переменной fillPtr
(которая на самом деле избыточна, поскольку songList
и fillPtr
указывают на одно и то же место).
Кроме того, учтите, что strcspn
не всегда возвращает действительный индекс. Если он не найдет совпадения, он вернет длину первого аргумента.
Я думаю, это больше похоже на то, что вы пытаетесь сделать:
int main(void)
{
const int numSongs = 10;
struct songInfo songList[numSongs];
char tempArtist[30];
char tempSong[30];
int i;
int newline_idx;
for (i = 0; i < numSongs; ++i)
{
printf("Please enter the artist name: ");
fgets(tempArtist, sizeof(tempArtist), stdin);
newline_idx = strcspn(tempArtist, "\n");
if (newline_idx < sizeof(tempArtist))
tempArtist[newline_idx] = 0;
printf("Please enter the song name: ");
fgets(tempSong, sizeof(tempSong), stdin);
newline_idx = strcspn(tempSong, "\n");
if (newline_idx < sizeof(tempSong))
tempSong[newline_idx] = 0;
getSongInfo(&songList[i], tempArtist, tempSong);
printf("Song and Artist Captured! \n");
}
for (i = 0; i < numSongs; ++i)
{
free(songList[i].songArtist);
free(songList[i].songTitle);
}
}
Вы можете рассмотреть возможность разделения кода для free()
на каждую структуру в ее собственную функцию.
Вы также можете рассмотреть предупреждение компилятора, а не игнорировать его, как прокомментировал Бодо. Неосторожное обращение со строками из stdin опасно.