realloc()没有返回带有旧值副本的新块

时间:2012-06-28 02:20:04

标签: c memory-management realloc

考虑以下代码:

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()返回的新指针不保留先前传递的缓冲区。

2 个答案:

答案 0 :(得分:4)

它正在将缓冲区复制到新缓冲区(如果不相同)。问题是你要覆盖缓冲区。 " pval = val;"将写入点设置为缓冲区的第一个字节,重新获得任何内容。尝试更改为" pval = val + loaded;"。

答案 1 :(得分:2)

在致电realloc后,您将pval重新分配给valtmpbuf又从realloc分配。换句话说,每次调用pval后,{{1}}都会重置指向动态缓冲区的开头。