逐个字符地复制一行文件

时间:2014-04-23 19:23:12

标签: c

我正试图从一个字符逐个字符地读取一行(试图学习C,我知道frets,但不使用它)。但我一直得到一个malloc错误,我不明白这是我的代码的一部分,给我一个错误:

char c;
char *buffer;

if ((buffer = malloc(sizeof(char) * 100)) == NULL)
{
    DXLogError("Cannot allocated memory!");
    return 0;
}

while ((c = fgetc(fp)) != EOF)
{
    printf("%c", c);
    if (c == '\n')
    {
        *buffer = '\0';
        break;
    }

    *buffer++ = c;

}

printf("End: %s", buffer);
free(buffer);
<--error here

错误:对象0x10aa1f833的malloc: *错误:未释放指针被释放 * 在malloc_error_break中设置断点以进行调试

3 个答案:

答案 0 :(得分:4)

您的*buffer++ = c已修改buffer。所以buffer不再是你分配的指针。因此,当您执行后续free(buffer);

时出现错误

在这种情况下,您可以使用另一个临时缓冲区指针作为&#34;移动&#34;指针,但buffer保持free完整。

您可能遇到的下一个问题是当您尝试读取/写入其中包含超过100个字节的行的文件时,因为您的缓冲区只有100个字节长。所以你应该检查一下。

答案 1 :(得分:2)

您正在递增buffer,因此传递给free的指针不是您分配的指针。

您还必须存储初始指针:

// your allocation code...
char * originalBuffer = buffer;

// your while loop...

free(originalBuffer);

或者,您可以使用第二个指针进行循环,并使用原始指针释放,如lurker所示。

答案 2 :(得分:1)

除了其他人所说的,你也无法打印出你用这个分配的内存位置中存储的字符序列。这是因为您将最后一个字符的地址'\0'传递给printf作为第二个参数。

你应该再次传递第一个角色的地址;这是您最初存储到buffer的地址。

考虑不要违反buffer,使用其他变量,让我们称之为iint i;,您将用它作为内存位置的索引。

buffer[0];  // equivalent to *(buffer + 0)
buffer[1];  // equivalent to *(buffer + 1)
buffer[2];
//...
buffer[99];

这些是您手中的记忆位置,您可以使用i在其中漫步,而不是违反buffer