2

知道为什么我会收到错误 realloc(): invalid next size 吗?

  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 ***
4

1 回答 1

4

这是因为你 memcpy sizeof(nextLine) 字节,破坏了你分配的内存。而不是 sizeof(nextLine) 你应该使用 strlen(nextLine) 并且事情应该没问题。

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

Valgrind 是您解决此类问题的朋友。

于 2012-12-07T00:22:20.797 回答