在调用之前确定realloc()行为

Ant*_*Ant 6 c memory-management

据我了解,当被要求保留更大的内存块时,realloc()函数将执行以下三种不同的操作之一:

if free contiguous block exists
    grow current block
else if sufficient memory
    allocate new memory
    copy old memory to new
    free old memory
else
    return null

增长当前块是一个非常便宜的操作,所以这是我想利用的行为.但是,如果我正在重新分配内存,因为我想(例如)在现有字符串的开头插入一个char,我不希望realloc()复制内存.我最终会用realloc()复制整个字符串,然后再次手动复制它以释放第一个数组元素.

是否可以确定realloc()将执行哪些操作?如果是这样,是否有可能以跨平台的方式实现?

Rôm*_*con 7

realloc()的行为可能取决于其具体实施.并且基于此代码将是一个可怕的黑客,至少可以说,违反了封装.

针对您的具体示例的更好解决方案是:

  1. 找到当前缓冲区的大小
    • 分配一个新缓冲区(with malloc()),大于前一个缓冲区
    • 将所需的前缀复制到新缓冲区
    • 将前一个缓冲区中的字符串复制到新缓冲区,从前缀开始
    • 释放上一个缓冲区