3

考虑这段代码:

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

4

2 回答 2

4

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

于 2012-06-28T02:31:19.610 回答
2

调用 to 后realloc,您重新分配pvalval,而后者又分配自tmpbuf。换句话说,在每次调用 , 之后reallocpval都会将点重置为动态缓冲区的开头。

于 2012-06-28T02:31:54.350 回答