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

时间:2014-11-13 21:30:25

标签: 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[index-1] = 0 : 0;
printf("test.txt: %s\n", buf_test);
fclose(stream);
free(buf_test);

当我运行valgrind检查它是否正确管理内存时,我得到:

  

总堆使用量:2个allocs,2个frees,1,592个字节分配   所有堆块都被释放 - 没有泄漏可能

但是当我改变这个时:

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检测到分配了580,952个字节,但仍然可以访问..

这里发生了什么?

1 个答案:

答案 0 :(得分:3)

发生的事情是:

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