据我了解,当被要求保留更大的内存块时,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()将执行哪些操作?如果是这样,是否有可能以跨平台的方式实现?
realloc()
的行为可能取决于其具体实施.并且基于此代码将是一个可怕的黑客,至少可以说,违反了封装.
针对您的具体示例的更好解决方案是:
找到当前缓冲区的大小
分配一个新缓冲区(with malloc()
),大于前一个缓冲区
将所需的前缀复制到新缓冲区
将前一个缓冲区中的字符串复制到新缓冲区,从前缀开始
释放上一个缓冲区