malloc和fgetc内存泄漏

malloc和fgetc内存泄漏,c,pointers,dynamic-memory-allocation,realloc,C,Pointers,Dynamic Memory Allocation,Realloc,我在使用malloc和getchar从用户那里读取like时遇到了一些问题。我得到了结果,但是,我使用valgrind得到了内存泄漏。我对此一无所知,曾询问过我的同学和导师,但似乎没有人知道原因 char *ReadLineFile(FILE *infile){ int i=0; char c; char *newStringLine; newStringLine = (char *) malloc(sizeof(char)); while( (c = fgetc(

我在使用malloc和getchar从用户那里读取like时遇到了一些问题。我得到了结果,但是,我使用valgrind得到了内存泄漏。我对此一无所知,曾询问过我的同学和导师,但似乎没有人知道原因

char *ReadLineFile(FILE *infile){
   int i=0;
   char c;
   char *newStringLine;
   newStringLine = (char *) malloc(sizeof(char));
   while( (c = fgetc(infile)) != '\n' ){
        newStringLine[i++] = c;
        realloc(newStringLine, (sizeof(char) * (i+1)));
   }
   newStringLine[i] = '\0';
   return newStringLine;
}

Valgrind给了我几个错误,包括无效的1写入/读取和无效的realloc。

您使用的
realloc()
是错误的

realloc()
,如果成功,将释放传递的指针,并返回带有分配内存的新指针。你需要

  • 在临时指针中捕获
    realloc()
    的返回值
  • 检查NULL以确保成功,然后

    • 如果返回的指针不为NULL,即重新分配成功,则使用新指针
    • 如果返回的指针为NULL,则做出一些决定,然后可以继续使用旧指针(作为参数传递)
相关,引用第§7.22.3.5章
C11

realloc
函数解除分配由
ptr
指向的旧对象,并返回 指向新对象的指针,该对象的大小由
size
指定。[……]

以及

[…]如果无法创建新对象的内存 分配后,旧对象不会被解除分配,其值不变

否则,如果,
realloc()
成功,您(很可能)正在尝试使用已经空闲的d内存,这当然会导致



哦,我刚才提到过吗?

您使用的
realloc()
是错误的

realloc()
,如果成功,将释放传递的指针,并返回带有分配内存的新指针。你需要

  • 在临时指针中捕获
    realloc()
    的返回值
  • 检查NULL以确保成功,然后

    • 如果返回的指针不为NULL,即重新分配成功,则使用新指针
    • 如果返回的指针为NULL,则做出一些决定,然后可以继续使用旧指针(作为参数传递)
相关,引用第§7.22.3.5章
C11

realloc
函数解除分配由
ptr
指向的旧对象,并返回 指向新对象的指针,该对象的大小由
size
指定。[……]

以及

[…]如果无法创建新对象的内存 分配后,旧对象不会被解除分配,其值不变

否则,如果,
realloc()
成功,您(很可能)正在尝试使用已经空闲的d内存,这当然会导致



哦,我提到了吗?

回答得很快!我试着不铸造它,但是,我一直得到同样的泄漏和错误。你应该使用
realloc
的返回值。你把它扔掉了。@ricknaght完全忽略了关于铸造马洛克的回归的参考。一个不知道如何编写代码的低级程序员给出了一个答案。这是一个快速的回答!我试着不铸造它,但是,我一直得到同样的泄漏和错误。你应该使用
realloc
的返回值。你把它扔掉了。@ricknaght完全忽略了关于铸造马洛克的回归的参考。一个不知道如何编写代码的低水平程序员给出了一个答案:“如果realloc()成功,那么您正试图使用一个已经空闲的d内存”:如果系统只是增加块的大小而不移动内存(这种情况经常发生),则不必如此。“但这是轮盘赌,”让·弗朗索瓦·法布说,“嗯,这不是保证,对吧?最好小心点。:)当然但我也看到过类似这样的问题,OP可以将代码运行到内存移动的某个点。错误的印象,它的工作@让·弗朗索瓦·法布,这正是我想要避免的。不过,添加了一条注释。:)成功了!正如建议的那样,我使用了一个临时变量,然后简单地将它赋回到我的newStringLine指针。这确实给了我一个教训!谢谢“如果realloc()成功,那么您正试图使用一个已经空闲的d内存”:如果系统只是增加块的大小而不移动内存(这种情况经常发生),则不一定如此。“但这是轮盘赌,”让·弗朗索瓦·法布说,“嗯,这不是保证,对吧?最好小心点。:)当然但我也看到过类似这样的问题,OP可以将代码运行到内存移动的某个点。错误的印象,它的工作@让·弗朗索瓦·法布,这正是我想要避免的。不过,添加了一条注释。:)成功了!正如建议的那样,我使用了一个临时变量,然后简单地将它赋回到我的newStringLine指针。这确实给了我一个教训!谢谢