为什么这个程序不是一次又一次地显示第一行?

Abh*_*ogi 2 c gcc file-handling

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *readLine(FILE *inFile)  //Simply reads line in a text file till "\n"
{
    char *line = realloc(NULL, 1);
    char c;
    int i=0;
    while (!feof(inFile))
    {
        c = fgetc(inFile);
        if (ferror(inFile)) printf("Error reading");
        if (c == 10)
            {
                realloc(line,i+1);
                line[i]= 10;
                break;
            }
        realloc(line, i+1);
        line[i++] = c;
    }
    return line;
}

int main(int argc,char **argv)
{
    FILE *inFile;
    inFile = fopen("testFile","r");
    printf("%s",readLine(inFile));
    printf("%s",readLine(inFile));
    printf("%s",readLine(inFile));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果testFile的内容是: -

abc
def
ghi
Run Code Online (Sandbox Code Playgroud)

三个printf语句应该显示"abc"三次..但输出是: -

abc
def
ghi
Run Code Online (Sandbox Code Playgroud)

我知道我在某个地方的概念是错的.请帮忙.

Ale*_*x B 6

用法realloc()不正确.

realloc(line,i+1); // wrong

// OK
void *new_line = realloc(line,i+1);
if (!new_line)
{
    free(line);
    return NULL;
}
line = new_line;
Run Code Online (Sandbox Code Playgroud)

因为line是按值传递的,所以它没有改变.实际重新分配的内存在返回值中.因此line,一遍又一遍地保持不变,你一遍又一遍地看到同一条线. 编辑:刚才意识到即使这是一个错误,它也不会导致重复的行.其他要点仍然有效.

更糟糕的是:

  1. 每次丢失新重新分配的指针都会导致内存泄漏.
  2. 您可能正在访问释放的内存,因为旧line值在重新分配后可能会变得无效,如果它在堆的不同部分重新分配.
  3. 您正在为每个字符重新分配内存,这可能是一项昂贵的操作.

  • 我想补充一下这个+1答案你不应该为每个角色"重新分配".这是一个相对昂贵的过程.调整缓冲区的方法有两种常用方法.1)具有初始分配(例如1024字节)和每次需要扩展缓冲区时添加的增量大小(512字节).并且2)具有默认大小(例如,64字节),并且每次重新分配时大小加倍.哦,如果你想看到它们,你也应该把'\n'放在琴弦的末尾; printf通常使用缓冲输出. (3认同)