如何在函数外释放malloc()使用的内存?

时间:2019-05-16 15:59:52

标签: c pointers malloc

我试图释放由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 :(得分:0)

您的getSongInfo函数不会返回指针,因此尝试将返回值放入变量然后释放它是没有意义的。有问题的指针位于struct songInfo内部,具体而言,位于fillPtr变量中(由于songListfillPtr指向同一位置,因此实际上是多余的)。

此外,请注意,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()的代码拆分为各自的函数。

您还可以考虑留意该编译器警告,而不是忽略它,如Bodo所说。粗心地处理stdin中的字符串是危险的。