例如,我想要这样一个功能:
char *dst = (char*)malloc(512);
char *src = (char*)malloc(1024);
...
dst = (char*)realloc(dst, 1024);
memcpy(dst, src, 1024);
如您所见,我只想让函数realloc()扩展缓冲区的大小,但C库中的realloc()可能会从旧地址复制数据。那么在我想要的任何库中都有一个函数吗?
答案 0 :(得分:5)
为什么不呢:
free(dst);
dst = malloc(1024);
另请注意,realloc
可能会移动块并调整其大小,因此保留前一次调用malloc
,calloc
或realloc
返回的旧指针可能不再指同一块。
答案 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个新字节的指针