我知道为什么我收到错误,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 ***
答案 0 :(得分:4)
这是因为你记忆了sizeof(nextLine)字节,在你分配的内存之外进行了破坏。
,而不是sizeof(nextLine),你应该使用strlen(nextLine)这样的Realloc错误通常表明内存堆已损坏,这通常是由于越界写入或重用已释放的指针而发生的。
Valgrind是你这样的问题的朋友。