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

时间:2019-04-18 12:35:12

标签: c

嘿,我正在做一个有关奥林匹克数据库的项目,该项目保留了奖牌记录。 现在我有一个释放内存的问题(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");              
        }   
    }
}

2 个答案:

答案 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。