Как я могу освободить память, используемую malloc () вне функции? - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь освободить память, выделенную моей функцией getSongInfo, я попытался использовать указатель на вызов функции, но я получаю ошибку «Невозможно назначить int для типа int *». Любая помощь будет великолепна, так как мой нынешний способ может сработать, но я могу ошибаться. Спасибо!

Исходная попытка:

int *memPtr = NULL
memPtr = getSongInfo(&fillPtr[arrayCounter], tempArtist[counter], tempSong[counter]);
Gives error!

Текущая попытка:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#pragma warning(disable:4996)

int getSongInfo(struct songInfo *pFillInfo, char *artistName, char *songName);
void printSongInfo(struct songInfo songList[10]);

struct songInfo {

    char *songArtist;
    char *songTitle;
};

int main(void)
{
    struct songInfo *fillPtr;
    struct songInfo songList[10];
    fillPtr = &songList[0];

    char tempArtist[10][30];
    char tempSong[10][30];

    int *memPtr = NULL;

    int i = 0;
    int counter = 0;
    int arrayCounter = 0;
    while (counter != 10)
    {
        printf("Please enter the artist name: ");
        fgets(tempArtist[counter], sizeof(tempArtist[counter]), stdin);
        tempArtist[counter][strcspn(tempArtist[counter], "\n")] = 0;
        printf("Please enter the song name: ");
        fgets(tempSong[counter], sizeof(tempSong[counter]), stdin);
        tempSong[counter][strcspn(tempSong[counter], "\n")] = 0;

        getSongInfo(&fillPtr[arrayCounter], tempArtist[counter], tempSong[counter]);
        printf("Song and Artist Captured! \n");
        counter++;
        arrayCounter++;

    }

    printSongInfo(fillPtr);
    free(fillPtr->songArtist);
    free(fillPtr->songTitle);
}

int getSongInfo(struct songInfo *pFillInfo, char *artistName, char *songName)
{

    pFillInfo->songArtist = (char*)malloc(strlen(artistName) + 1);
    pFillInfo->songTitle = (char*)malloc(strlen(songName) + 1);


    strcpy(pFillInfo->songArtist, artistName);
    strcpy(pFillInfo->songTitle, songName);

    return 1;
}

void printSongInfo(struct songInfo songList[10])
{
    int counter = 0;


    while (counter != 10)
    {
        printf("%-35s %-35s\n", songList[counter].songArtist, songList[counter].songTitle);
        counter++;
    }

}

1 Ответ

0 голосов
/ 16 мая 2019

Ваша 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 опасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...