为什么在没有数据复制的情况下,像realloc()这样的标准C库中没有函数?

时间:2011-07-14 15:43:36

标签: c memory realloc

例如,我想要这样一个功能:

char *dst = (char*)malloc(512);
char *src = (char*)malloc(1024);
...
dst = (char*)realloc(dst, 1024);
memcpy(dst, src, 1024);

如您所见,我只想让函数realloc()扩展缓冲区的大小,但C库中的realloc()可能会从旧地址复制数据。那么在我想要的任何库中都有一个函数吗?

3 个答案:

答案 0 :(得分:5)

为什么不呢:

free(dst);
dst = malloc(1024);

另请注意,realloc可能会移动块并调整其大小,因此保留前一次调用malloccallocrealloc返回的旧指针可能不再指同一块。

答案 1 :(得分:1)

realloc尝试在不复制的情况下扩展缓冲区,但只有在额外空间空闲时才能这样做。

在您的情况下,您刚刚为src分配了空间,而该内存块可能已经使用了realloc所需的空间。在这种情况下,它只能在其他地方分配一个更大的块,并将数据复制到该块。

答案 2 :(得分:0)

  

那么在我想要的任何库中都有一个函数吗?

不,没有。如果没有空间,系统应该如何扩展内存?

e.g。想象你这样做:

char *a = malloc(2);
char *b = malloc(2);

分配的内存现在可能如下所示:

1   2   3   4   5   6   7
-------------------------
|   |   |   |   |   |   |
-------------------------
\      /\       /\      /        
 \    /  \     /  \    /
   v        v        v
 memory   unused/   memory
 for "a"  internal   for "b"
         memory piece

现在你做realloc(a,10);。系统不能简单地将存储器件扩展为“a”。它会击中“b”使用的内存,所以相反它必须在内存中找到另外一个有10个连续空闲字节的位置,复制旧内存块的2个字节并返回指向这10个新字节的指针

相关问题