realloc()下一个大小无效

时间:2012-12-07 00:16:15

标签: c

我知道为什么我收到错误,realloc():下一个大小无效?

  while (loc) {
    char nextLine[MAX_PATH_LEN + 30];
    sprintf(nextLine, "<p>%s:%d</p>", loc->item.pathname,
    loc->item.offset);
    DPRINTF('h', ("Next line is: %s, length: %d\n", nextLine, strlen(nextLine))\
);

    DPRINTF('h', ("spaceUsedUp is %d\n", spaceUsedUp));
    while (spaceUsedUp + strlen(nextLine) > allocatedSize) {
      printf("Allocated size is now %d\n", allocatedSize);
      allocatedSize *= 2;
    }

    DPRINTF('h', ("Will realloc size %d\n", allocatedSize));
    char *tmp = (char *)realloc(result, allocatedSize);
    DPRINTF('h', ("Done with the realloc.\n"));
    fflush(stdout);
    if (tmp == NULL) {
      perror("realloc");
    }
    result = tmp;
    tmp = NULL;

    int theOne = (spaceUsedUp == 0) ? 0 : 1;
    memcpy(result+spaceUsedUp-theOne, nextLine, sizeof(nextLine));

    spaceUsedUp += strlen(nextLine) - theOne;
    loc = loc->nextLocation;
  }

输出结果为:

Next line is: <p>/dirA/f3:6162</p>, length: 20
spaceUsedUp is 0
Will realloc size 100
Done with the realloc.
Next line is: <p>/dirA/f3:6038</p>, length: 20
spaceUsedUp is 19
Will realloc size 100
*** glibc detected *** ./proj3/disksearch: realloc(): invalid next size: 0x0000000001797fa0 ***

1 个答案:

答案 0 :(得分:4)

这是因为你记忆了sizeof(nextLine)字节,在你分配的内存之外进行了破坏。

,而不是sizeof(nextLine),你应该使用strlen(nextLine)

这样的Realloc错误通常表明内存堆已损坏,这通常是由于越界写入或重用已释放的指针而发生的。

Valgrind是你这样的问题的朋友。