自由功能给出错误

时间:2014-03-17 10:18:19

标签: c memory-leaks segmentation-fault malloc free

我在一个函数中使用malloc。函数结束我调用自由函数以避免内存泄漏。但是,如果我自由呼叫,当我没有正常编程时,我会出现分段错误。谁知道为什么?我用注释标记了这些地方(如果我把free(line)放在这里我得到了seg错误。如果我不这样做就会发生内存泄漏)。这是我的代码:

void checkOccurrences(FILE *inp, char *wanted, int lineCount, int limit)
{
char option;
    char *line = malloc(INT_MAX * sizeof(char));
    int i, dif, lineNumber = 0;                 /*i for count, dif means difference*/
    char *temp, *checkpoint;
    while(fgets(line, INT_MAX, inp) != NULL) /*gets line by line*/
    {
        dif = strlen(line) - strlen(wanted);    /*for limit for loop*/
        ++lineNumber;                           /*increase line number*/
        for(i = 0; i < dif; ++i)                /*difference times loop*/
        {
            temp = strstr(line, wanted);    /*first occurrence address on line*/
            if(temp != NULL)                /*if there is occurrence*/
            {      /*temp>checkpoint condition means if there is new occurrences*/
                if(temp > checkpoint)
                {
                    ++lineCount;
                    if((lineCount % limit) == 0)
                    {
                        printLine(lineNumber);
                        checkpoint = temp;
                        printf("more(m) or quit(q) ");
                        scanf(" %c", &option);              /*get option*/
                        if(option == 'q')
                        {
                            /*If I put free(line) here I get seg fault*/
                            /*If I don't it occurs memory leak*/
                            exit(0);                /*end program*/
                        }
                    }
                    else
                    {
                        printLine(lineNumber);
                        checkpoint = temp;
                    }
                }
            }
            ++line;                         /*next address on line*/
        }
    }
    /*If I put free(line) here I get seg fault*/
    /*If I don't it occurs memory leak*/
}

/*GIT121044025*/

2 个答案:

答案 0 :(得分:2)

您似乎正在循环中更改line,因此您无法自由使用malloc()

指定的相同指针

您应该复制指针以便在循环中进行修改,并保留原始内容。

您可能还想考虑做一些不太可怕的事情,而不是预先分配潜在的大量内存,以防万一,然后使用它而不进行错误检查。

(你不检查内存是否曾被分配过,你的fgets总是假设你有INT_MAX字节可用,即使你把指针增加到缓冲区后也是如此。)

答案 1 :(得分:1)

你在这里丢失了你的基地址:

++line;                         /*next address on line*/

line存储在temp变量中,如下所示:

char *line = malloc(INT_MAX * sizeof(char));
char *_temp = line ;

在功能结束时:

free(_temp);