gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:12:54 25 4
gpt4 key购买 nike

我有这个代码:

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 检查它是否正确管理内存时,我得到:

total heap usage: 2 allocs, 2 frees, 1,592 bytes allocated All heap blocks were freed -- no leaks are possible

但是当我改变这个时:

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 字节但仍可访问..

这里发生了什么?

最佳答案

发生的事情是:

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

关于c - 为什么 valgrind 在一个简单的 while 循环中检测到如此多的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26918787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com