【问题标题】:realloc() are not returning a new block with a copy of old valuesrealloc() 没有返回带有旧值副本的新块
【发布时间】:2012-06-29 12:55:26
【问题描述】:

考虑这段代码:

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

【问题讨论】:

  • 我应该如何复制它? strncpy()val[x] = ..?
  • @RichardJ.RossIII 它实际上是 "*pval++ = *pbuf++;",但是空格使它看起来像一个奇怪的运算符。

标签: c memory-management realloc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    调用realloc 后,您将pval 重新分配给val,而val 又从tmpbuf 分配。换句话说,在每次调用 realloc 之后,pval 都会重置为动态缓冲区的开头。

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2017-12-04
      相关资源
      最近更新 更多