realloc:下一个大小无效

时间:2012-11-12 01:14:21

标签: c file-io

这个问题肯定与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()下一个尺寸无效。

这里有什么我想念的吗?

谢谢!

3 个答案:

答案 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))