gpt4 book ai didi

c - C 中的指针、文件和内存管理

转载 作者:行者123 更新时间:2023-12-03 22:20:26 24 4
gpt4 key购买 nike

我是 C 编程领域的新手,目前我正在同时探索指针、指针算法与文件 IO 和内存管理的组合。请在下面找到我的代码,这是我正在尝试做的。

我的程序应该使用 malloc 分配 8 字节的堆内存,然后将指针从 malloc 存储到一个 char*,然后打开一个文件 (text.txt),其中包含以下几行纯文本(每 8 字节长):

图表测试
chtest2!

然后我尝试使用 fread 从 text.txt 一次读取 8 个字节,直到到达文件末尾。 fread 中读取的 8 个字节存储在之前使用 malloc 分配的内存块中。然后我使用我的 char* 遍历 8 个字节并使用 printf 在 stdout 中打印每个字符。每 8 个字节后(直到 EOF)我将指针重置为 8 字节内存块的第 0 个字节并重复直到 EOF。

代码如下:

int main(void)
{
char* array = malloc(8 * sizeof(char));

if (array == NULL)
return 1;

FILE* inptr = fopen("text.txt", "r");

if (inptr == NULL)
return 2;

while (!feof(inptr))
{
fread(array, 8 * sizeof(char), 1, inptr);

for (int i = 0; i < 8; i++)
{
printf("%c", *array);
array++;
}
array -= 8;
}

free(array);
fclose(inptr);
return 0;
}

请记住,该程序已通过 valgrind 运行,它报告没有内存泄漏。这是我得到的输出:

图表测试
chtest2!
测试2

我不明白第三行是从哪里来的。

此外,我不明白为什么当我使用

重置我的字符指针(数组)时

数组 -= 7;

并运行 valgrind 报告:

泄漏摘要:
==8420== 绝对丢失:1 个 block 中的 8 个字节

逻辑上将 8 字节的堆内存视为字符数组,我们必须将指针返回 7 个位置才能到达点 0,但这种方法似乎会泄漏内存(而 array -= 8 很好)!

如果有人能分析一下,我将不胜感激。谢谢!

最佳答案

正如评论中所指出的,您错误地使用了 feof,这解释了额外的行。至于减去 7 而不是 8:你将 1 添加到 array 8 次,那么你为什么期望减去 7 可以让你回到开始的地方?

关于c - C 中的指针、文件和内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27643703/

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