我在一个函数中使用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*/
答案 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);