【发布时间】:2021-02-16 13:31:14
【问题描述】:
问题应该很简单,但我已经花了好几个小时,看不出我的逻辑有什么问题。输出正常工作,但 Valgrind 打印出应该修复的内存问题。我在while循环中添加了origdest = (char*)realloc(origdest, strlen(origdest) + i * sizeof(char));代码,我的问题是为什么不动态调整内存? Valgrind 给出的确切错误是
==9== Invalid write of size 1
==9== at 0x1087E2: mystrcat (mystrcat.c:18)
==9== by 0x10883C: main (mystrcat.c:34)
==9== Address 0x522d046 is 6 bytes inside a block of size 7 free'd
==9== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9== by 0x1087C2: mystrcat (mystrcat.c:17)
==9== by 0x10883C: main (mystrcat.c:34)
==9== Block was alloc'd at
==9== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9== by 0x108811: main (mystrcat.c:31)
char *mystrcat(char *dest, const char *src)
{
char *origdest = dest;
while(*dest) {
dest++;
}
int i = 1;
while (*src) {
origdest = (char*)realloc(origdest, strlen(origdest) + i * sizeof(char));
*dest++ = *src++; // Copies character and increases/moves pointer
i++;
}
*dest = 0;
return origdest;
}
int main(void)
{
char *str = malloc(7);
strcpy(str, "Mydogs");
str = mystrcat(str, "arecool");
printf("%s\n", str);
free(str);
}
【问题讨论】:
-
重新分配后,您必须假设分配的空间移动了。
dest指针不再有效。您必须重新确定应将额外材料复制到的位置。