gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:17:48 24 4
gpt4 key购买 nike

我正在尝试释放 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++;
}

}

最佳答案

您的 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 评论的那样,您也可以考虑注意编译器警告而不是忽略它。粗心地处理来自标准输入的字符串是危险的。

关于c - 如何释放函数外部 malloc() 使用的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56172493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com