这个问题肯定与this有关,它的答案就是基于我的功能。
char *get_next_line(FILE *fp) {
char ch = 0;
int CUR_MAX = 4095;
char *buffer = (char*) malloc(sizeof(char) * CUR_MAX); // allocate buffer.
char *temp = (char*) malloc(sizeof(char) * CUR_MAX); // allocate buffer.
int count = 0;
int length = 0;
while ((ch != '\n')) {
if (ch == '\377') { return NULL; }
if(count ==CUR_MAX) {
CUR_MAX *= 2;
count = 0;
if ((temp = realloc(buffer, CUR_MAX)) != NULL) {
buffer = temp;
free(temp);
}
}
ch = getc(fp);
buffer[length] = ch;
length++;
count++;
}
出于某种原因,当我阅读非常大的字符串时,我面临着:
检测到 glibc - realloc()下一个尺寸无效。
这里有什么我想念的吗?
谢谢!
答案 0 :(得分:4)
当你:
free(temp);
buffer
也被释放,因为:
buffer = temp;
所以稍后你会尝试:
realloc(buffer, CUR_MAX)
由于buffer
已通过temp
间接释放,因此无效。你不能realloc()
释放指针。
答案 1 :(得分:2)
我相信你正在访问malloced / realloced区域之外的内存。
不在你的内容中设置count = 0
应该解决这个问题。
试着详细说明......
启动公式时:
count = 0
length = 0
CUR_MAX = 4095
这些将增加,直到达到4095.一旦达到4095,我们将:
count = 0
length = 4096
CUR_MAX = 8190
然后我们将增加直到计数为8190.在此之前,我们有:
count = 8100
length = 12196
CUR_MAX = 8190
您的数组长度仅为8190,但您要取消引用buffer[12196]
,这是一个无效的索引。
此外,您可能希望在else
时处理temp == NULL
案例。这可能由assert
或大的旧故障处理。并且不要free(temp)
在你的成功方面。这释放了你刚试图分配的内存。并导致您的新细分错误。
答案 2 :(得分:-1)
realloc(buffer, CUR_MAX))
返回指向void的指针。
我认为正确的陈述是(char *)realloc(buffer, CUR_MAX))