【发布时间】:2014-12-25 02:08:22
【问题描述】:
我是 C 编程领域的新手,目前我正在同时探索指针、指针算法与文件 IO 和内存管理的组合。请在下面找到我的代码,这就是我想要做的。
我的程序应该使用 malloc 分配 8 字节的堆内存,然后将指针从 malloc 存储到 char*,然后打开一个文件 (text.txt),其中包含以下纯文本行(每个 8 字节长):
图表
chtest2!
然后我尝试使用 fread 从 text.txt 一次读取 8 个字节,直到到达文件末尾。 fread 中读取的 8 个字节存储在之前使用 malloc 分配的内存卡盘中。然后我使用我的 char* 迭代 8 个字节并使用 printf 在标准输出中打印每个字符。每 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!
htest2
我不明白第 3 行是从哪里来的。
此外,我不明白为什么当我使用
重置我的 char 指针(数组)时数组 -= 7;
并通过 valgrind 运行它报告:
泄漏摘要:
==8420== 肯定丢失了:1 个块中的 8 个字节
在逻辑上将 8 个字节的堆内存视为一个字符数组,我们必须将指针返回 7 个位置才能到达点 0,但这种方法似乎会泄漏内存(而数组 -= 8 很好)!
如果有人能对此进行分析,我将不胜感激。谢谢!
【问题讨论】:
-
sizeof(char)始终为 1 -
感谢大家的cmets!
-
Bear in bind
fread()不读取行,它读取字节。一行和另一行之间的中断也包含符号,即使它们是不可见的,fread()也会读取它们。这可能是造成混乱的原因。 -
此外,
fread()将只读取您告诉它的内容,并填充缓冲区。但是,C 中的正确字符串是以空值结尾的。fread()不保证缓冲区将以\0终止。
标签: c pointers memory-management file-io pointer-arithmetic