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

leg*_*lee 3 c memory realloc

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

char *dst = (char*)malloc(512);
char *src = (char*)malloc(1024);
...
dst = (char*)realloc(dst, 1024);
memcpy(dst, src, 1024);
Run Code Online (Sandbox Code Playgroud)

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

Bla*_*iev 5

为什么不呢:

free(dst);
dst = malloc(1024);
Run Code Online (Sandbox Code Playgroud)

另请注意,realloc可以移动块以及调整块大小,因此保持前一次调用返回的旧指针malloc,calloc或者realloc可能不再引用相同的块.

  • @tristopia:如果重新分配失败,`realloc`不会丢失旧指针.相反,在覆盖旧指针之前没有检查失败的破坏的**调用代码**会导致它丢失. (4认同)
  • 如果重新分配失败,realloc可能会丢失指针. (2认同)

Bo *_*son 2

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

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