我试图学习C(这很难......)所以我想编写一个获取文件行的例程。我创建了这个函数:
int c;
int buflen = 100;
if((*buffer = malloc(sizeof(char) * buflen)) == NULL) {
DXLogWarn("Not enough memory");
return;
}
char * dst = *buffer;
char * end = *buffer + buflen - 1;
while ((c = getc(fp)) != EOF) {
if (c == '\n') {
break;
}
if (dst < end) {
*dst++ = c;
}
}
*dst = '\0';
哪个有效!但是现在我想的不是剪切字符串的最后部分而是重新分配缓冲区并继续直到&#39; \ n&#39;。所以我改成了这个:
void fget_line(FILE *fp, char **buffer) {
int c;
int buflen = 10;
if((*buffer = malloc(sizeof(char) * buflen)) == NULL) {
DXLogWarn("Not enough memory");
return;
}
char * dst = *buffer;
char * end = *buffer + buflen - 1;
while ((c = getc(fp)) != EOF) {
if (c == '\n') {
break;
}
if (dst < end) {
*dst++ = c;
} else {
buflen *= 2;
*buffer = realloc(*buffer, buflen * sizeof(char));
if (*buffer == NULL) {
DXLogError("Err");
return;
}
}
}
*dst = '\0';
}
这给了我一个错误:malloc: *对象0x10a8001b8的错误:释放对象的校验和不正确 - 对象可能在被释放后被修改。 * 在malloc_error_break中设置断点以进行调试
我没有得到。我做错了什么?
答案 0 :(得分:1)
从一开始你就做了:
char * dst = *buffer;
char * end = *buffer + buflen - 1;
这设置dst并结束缓冲区内的正确位置。然后重新分配缓冲区:
*buffer = realloc(*buffer, buflen * sizeof(char));
这会导致缓冲区获得一个可能与以前不同的新值。因此,您还必须将dst
和end
更新为缓冲区内的新位置。
更改end
很简单,但由于您不断更改dst
,因此很难计算新值。因此,不是更改指针,而是将偏移量存储为整数可能更容易。类似的东西:
int pos=0;
while ((c = getc(fp)) != EOF) {
if (c == '\n') {
break;
}
if (pos >= buflen-1) {
buflen *= 2;
*buffer = realloc(*buffer, buflen * sizeof(char));
if (*buffer == NULL) {
DXLogError("Err");
return;
}
}
(*buffer)[pos] = c;
pos++;
}
(*buffer)[pos] = '\0';
我还更改了上面的if语句,因为你没有存储导致重新分配的字符。