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

标签 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

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

是否有可能确定 realloc() 将做什么?如果可以,是否可以通过跨平台的方式实现?

最佳答案

realloc() 的行为可能取决于其具体实现。将你的代码基于此将是一个可怕的黑客攻击,至少可以说,它违反了封装。

针对您的特定示例的更好解决方案是:

  1. 找到当前缓冲区的大小
    • 分配一个新缓冲区(使用 malloc()),比之前的缓冲区大
    • 复制你想要的前缀到新缓冲区
    • 将前一个缓冲区中的字符串复制到新的缓冲区中,从前缀之后开始
    • 释放之前的缓冲区

关于c - 在调用之前确定 realloc() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/216426/

相关文章:

c - 对于转换指针数组(例如 *array[]),为什么使用 (void**) 而不是 (void*)

c - 在此 C 程序示例中,如何在不使用指针的情况下获取数组输出?

c++ - 基于 CRT 调试堆函数构建的内存跟踪器

c# - 类实例的内存管理

iphone - 需要澄清 NSAutoreleasePool

ios - 为什么我的 UIViewController View 在可见时被卸载?

C Syslog API - 如何覆盖 _PATH_LOG

c - 为什么我的变量没有增加?

Java 8 分配了太多内存

c - 一个程序,给定一个字符串、一个宽度和一个用于输出的空字符串,该程序将字符串置于输出区域的中心。