C 为什么valgrind在一个简单的while循环中检测到这么多内存分配

C 为什么valgrind在一个简单的while循环中检测到这么多内存分配,c,memory,memory-management,valgrind,C,Memory,Memory Management,Valgrind,我有以下代码: FILE *stream; char *buf_test = calloc(1024, sizeof(char)); size_t index = 0; stream = fopen("test.txt", "r"); while (fgets(&buf_test[index], 1024, stream) != NULL) index = strlen(buf_test); (buf_test[index-1] == '\n') ? buf_test[inde

我有以下代码:

FILE *stream;
char *buf_test = calloc(1024, sizeof(char));

size_t index = 0;
stream = fopen("test.txt", "r");
while (fgets(&buf_test[index], 1024, stream) != NULL)
    index = strlen(buf_test);
(buf_test[index-1] == '\n') ? buf_test[index-1] = 0 : 0;
printf("test.txt: %s\n", buf_test);
fclose(stream);
free(buf_test);
当我运行valgrind检查它是否正确管理内存时,我得到:

总堆使用率:2个alloc,2个free,分配了1592个字节 所有堆块都已释放--不可能发生泄漏

但当我改变这一点时:

stream = fopen("test.txt", "r");
while (fgets(&buf_test[index], 1024, stream) != NULL)
    index = strlen(buf_test);
为此:

while (fgets(&buf_test[index], 1024, (stream = fopen("test.txt", "r"))) != NULL)
    index = strlen(buf_test);
我发现一个分段错误,valgrind检测到分配了580952个字节,但仍然可以访问


这里发生了什么?

发生的是:

  • 您打开的循环文件的每次迭代
  • fopen创建并返回一个文件*,该文件可能会为该文件*或该文件的任何内部成员动态分配内存*
  • 一个进程通常只能打开有限数量的文件
  • 最终,您达到了该限制,并且fopen()失败(它返回一个空指针)
  • 然后将该空指针传递给fgets(),这是未定义的行为,会导致程序崩溃

    • 发生的事情是:

      • 您打开的循环文件的每次迭代
      • fopen创建并返回一个文件*,该文件可能会为该文件*或该文件的任何内部成员动态分配内存*
      • 一个进程通常只能打开有限数量的文件
      • 最终,您达到了该限制,并且fopen()失败(它返回一个空指针)
      • 然后将该空指针传递给fgets(),这是未定义的行为,会导致程序崩溃

        • 发生的事情是:

          • 您打开的循环文件的每次迭代
          • fopen创建并返回一个文件*,该文件可能会为该文件*或该文件的任何内部成员动态分配内存*
          • 一个进程通常只能打开有限数量的文件
          • 最终,您达到了该限制,并且fopen()失败(它返回一个空指针)
          • 然后将该空指针传递给fgets(),这是未定义的行为,会导致程序崩溃

            • 发生的事情是:

              • 您打开的循环文件的每次迭代
              • fopen创建并返回一个文件*,该文件可能会为该文件*或该文件的任何内部成员动态分配内存*
              • 一个进程通常只能打开有限数量的文件
              • 最终,您达到了该限制,并且fopen()失败(它返回一个空指针)
              • 然后将该空指针传递给fgets(),这是未定义的行为,会导致程序崩溃

              你一遍又一遍地打开文件你一遍又一遍地打开文件你一遍又一遍地打开文件你一遍又一遍地打开文件