6

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

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

如您所见,我只希望函数 realloc() 扩展缓冲区的大小,但 C 库中的 realloc() 可能会从旧地址复制数据。那么任何库中是否有我想要的功能?

4

3 回答 3

4

为什么不只是:

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

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

于 2011-07-14T15:47:52.777 回答
2

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

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

于 2011-07-14T15:57:25.913 回答
0

那么任何库中是否有我想要的功能?

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

例如想象你这样做:

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

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

1 2 3 4 5 6 7
-------------------------
| | | | | | |
-------------------------
\ /\ /\ /        
 \ / \ / \ /
   vvv
 未使用的内存/内存
 对于“a”内部对于“b”
         记忆片

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

于 2011-07-14T16:05:39.093 回答