据我了解,当要求保留更大的内存块时,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()
的行为可能取决于其具体实现。将你的代码基于此将是一个可怕的黑客攻击,至少可以说,它违反了封装。
针对您的特定示例的更好解决方案是:
- 找到当前缓冲区的大小
- 分配一个新缓冲区(使用
malloc()
),比之前的缓冲区大 - 复制你想要的前缀到新缓冲区
- 将前一个缓冲区中的字符串复制到新的缓冲区中,从前缀之后开始
- 释放之前的缓冲区
- 分配一个新缓冲区(使用
关于c - 在调用之前确定 realloc() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/216426/