考虑以下代码:
char buffer[] = "abcdefghijklmnopqrstuvwxyz",
*val = malloc(10), *pbuf = buffer, *pval = val, *tmpbuf;
int size = 10,loaded = 0;
while(*pbuf) {
if((loaded + 1) >= size) {
size += 10;
tmpbuf = realloc(val, size);
if(tmpbuf != NULL) {
val = tmpbuf;
pval = val;
} else {
printf("realloc()\n");
exit(-1);
}
}
*pval ++= *pbuf ++;
loaded ++;
}
*pval ++= '\0';
printf("%s\n", val);
free(val);
它打印tuvwxyz
而不是abcdefghijklmnopqrstuvwxyz
。
为什么呢?根据文档,realloc()
返回的新指针不保留先前传递的缓冲区。
答案 0 :(得分:4)
它正在将缓冲区复制到新缓冲区(如果不相同)。问题是你要覆盖缓冲区。 " pval = val;"将写入点设置为缓冲区的第一个字节,重新获得任何内容。尝试更改为" pval = val + loaded;"。
答案 1 :(得分:2)
在致电realloc
后,您将pval
重新分配给val
,tmpbuf
又从realloc
分配。换句话说,每次调用pval
后,{{1}}都会重置指向动态缓冲区的开头。