分配给缓冲区时fgets泄漏

mon*_*ing 4 c memory-leaks fgets

我在理解为什么在一种情况下代码泄漏,而在另一种情况下没有问题.不同的是

while(NULL!=fgets(buffer,length,file))//doesnt leak
while(NULL!=(buffer=fgets(buffer,length,file))//leaks
Run Code Online (Sandbox Code Playgroud)

我以为会是一样的.

完整代码如下.

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

#define LENS 10000

void no_leak(const char* argv){
  char *buffer = (char *) malloc(LENS);
  FILE *fp=fopen(argv,"r");

  while(NULL!=fgets(buffer,LENS,fp)){
    fprintf(stderr,"%s",buffer);

  }
  fclose(fp);
  fprintf(stderr,"%s\n",buffer);
  free(buffer);  


}
void with_leak(const char* argv){
  char *buffer = (char *) malloc(LENS);
  FILE *fp=fopen(argv,"r");

  while(NULL!=(buffer=fgets(buffer,LENS,fp))){
    fprintf(stderr,"%s",buffer);

  }
  fclose(fp);
  fprintf(stderr,"%s\n",buffer);
  free(buffer);  


}
Run Code Online (Sandbox Code Playgroud)

Sal*_*gar 7

因为您正在重新分配用于指向的缓冲区.当你到达free(buffer);代码的末尾时,缓冲区将指向NULL(因为这是你为了退出while循环而测试的),因此当你调用free时,你不会在原始指针上调用它你是malloc的,你什么也没说.