嘿,我正在做一个有关奥林匹克数据库的项目,该项目保留了奖牌记录。 现在我有一个释放内存的问题(Valgrind错误),而且我不知道如何释放内存?
Valgrind错误来自以下行:
data[i].country = malloc(strlen(str) + 2);
add_country(countrydata, countryname, 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;
}
然后是主要功能
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");
}
}
}
答案 0 :(得分:1)
我认为问题来自
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
的回报就足够了)答案 1 :(得分:0)
您试图在data
函数中使用add_country
函数参数,就像它是一个数组一样,但是您只能创建一个变量:
struct Olympia* countrydata = malloc(sizeof(struct Olympia) * 1);
这确实创建了变量而不是数组。尝试将malloc
中的数字增加到sizeof(struct Olimpia) * 10
,以获得10个元素的数组。
提示:了解列表。
更新请查看realloc
函数的正确用法-这可能会引起问题。如果不成功,realloc
函数可能会返回NULL。