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(),这是未定义的行为,会导致程序崩溃
- 发生的事情是:
- 发生的事情是:
- 发生的事情是: