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

例如,我想要这样一个function:

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

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

realloc尝试会在不复制的情况下扩展缓冲区,但只有在额外空间空闲时才能执行此操作。

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

为什么不呢:

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

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

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

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

例如,想象你这样做:

 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个新字节的指针。