1

这个问题肯定与相关,它的答案是我基于我的功能。

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() 下一个大小无效。

我在这里缺少什么吗?

谢谢!

4

3 回答 3

4

当你:

free(temp);

buffer也被释放,因为:

buffer = temp;

所以稍后你会尝试:

realloc(buffer, CUR_MAX)

它无法工作,因为buffer已通过 . 间接释放temp。您不能realloc()释放指针。

于 2012-11-12T01:25:41.670 回答
2

我相信您正在访问分配/重新分配区域之外的内存。

不设置count = 0在您的 while 外观中应该可以解决此问题。


尝试并详细说明...

开始公式时:

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],这是一个无效的索引。


此外,您可能想处理elsewhen 的情况temp == NULL。这可能可以通过一个assert或一个大的旧故障来处理。不要free(temp)在你成功的一面。这释放了您刚刚尝试分配的内存。并导致您的新分段错误。

于 2012-11-12T01:20:40.347 回答
-1

realloc(buffer, CUR_MAX))返回指向 void 的指针。

我相信正确的说法是(char *)realloc(buffer, CUR_MAX))

于 2012-12-02T22:43:46.800 回答