我正试图从一个字符逐个字符地读取一行(试图学习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中设置断点以进行调试
答案 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
,使用其他变量,让我们称之为i
和int i;
,您将用它作为内存位置的索引。
buffer[0]; // equivalent to *(buffer + 0)
buffer[1]; // equivalent to *(buffer + 1)
buffer[2];
//...
buffer[99];
这些是您手中的记忆位置,您可以使用i
在其中漫步,而不是违反buffer
。