gpt4 book ai didi

C释放内存的问题,valgrind错误

转载 作者:行者123 更新时间:2023-11-30 19:02:32 25 4
gpt4 key购买 nike

嘿,我正在做一个关于奥林匹克数据库的项目,该数据库保存奖牌记录。现在我在释放内存时遇到问题(Valgrind 错误),并且我不知道应该如何释放内存?

Valgrind 错误来自以下行:

data[i].country = malloc(strlen(str) + 2);

add_country(国家/地区数据,国家/地区名称,i);

第一个函数尝试将国家/地区名称添加到数据库

    typedef struct Olympia
{
char* country;
int gold;
int silver;
int bronze;
}Olympia;


int add_country(struct Olympia* data, char* str, int i)
{
if (str[0] == '\0') //checking that input is correct
{
printf("Error! Try again!\n");
}

else
{
data[i].country = malloc(strlen(str) + 2); //allocating memory for country name
strcpy(data[i].country, str); //adding country to database
data[i].gold = 0; //setting medals to zero
data[i].silver = 0;
data[i].bronze = 0;
i++;
printf("Country added to database succesfully!\n");
}
return i;
}

然后是main函数

    int main(void)
{
char command;
int gold = 0;
int silver = 0;
int bronze = 0;
int i = 0;
char filename[100];

char* line = (char*)malloc((100) * sizeof(char)); //allocating memory for one stdin line
char* countryname = (char*)malloc(20 * sizeof(char)); // allocating memory for country name

struct Olympia* countrydata = malloc(sizeof(struct Olympia) * 1); //allocating memory for structure



while(1)
{
fgets(line, 100, stdin); //reading one line of stdin

if (feof(stdin) != 0)
{
printf("File processing completed!\n");
free(line);
free(countryname);
free(countrydata);
return 0;
}

switch (line[0]) //finding the right command
{
case 'A':
if (sscanf(line, "%c %s", &command, countryname) == 2)
{
add_country(countrydata, countryname, i);
i++;
countrydata = realloc(countrydata, sizeof(struct Olympia) * (i + 1));
}
else
{
printf("Error! Invalid input, try again!");
}
break;
case 'Q':
free(line);
free(countryname);
free(countrydata);
return(EXIT_SUCCESS);

default:
printf("Error! Invalid input.\n");
}
}
}

最佳答案

我认为问题出在

data[i].country = malloc(strlen(str) + 2);  //allocating memory for country name

永远不会被释放。

要纠正此问题,请修改 Q 语句:

case 'Q':
{
int j;
for (j = 0; j < i; ++j)
{
free(countrydata[i].countryname);
}
free(line);
free(countryname);
free(countrydata);
return(EXIT_SUCCESS);
}

但是您的代码还有其他问题:

  • 您不测试 *alloc 函数返回,
  • 您使用feof,这会适得其反(测试fgets返回就足够了)
  • 在静态就足够的情况下使用动态内存(线路、国家/地区名称)

关于C释放内存的问题,valgrind错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55746182/

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