如何实现内存的“剪切粘贴”操作?是否有对应封装函数?
内存剪切粘贴的实现方案
标准C/C++库没有专门封装的“剪切粘贴”内存操作函数,这类需求属于基础内存操作的组合场景,标准库仅提供最基础的内存移动(memmove)、复制(memcpy)和填充(memset)函数,具体的组合逻辑需要开发者自行实现。
公认的实现方式
最直接且通用的实现思路就是你提到的:先用memmove完成内存块的移动(自动处理地址重叠问题),再用memset清理冗余的内存区域。关键是要准确计算需要清理的范围,避免越界或遗漏。
针对你需求的具体实现
结合你给出的代码场景,以下是符合需求的mem_cutpaste函数实现,调用后能让数组变为"2345\0\0\0\0":
#include <cstring> // 内存剪切粘贴函数:将src指向的count字节移动到dest,随后清理缓冲区中超出目标数据的部分为0 // buf_total_size:整个缓冲区的总大小,用于确定需要清理的范围 void mem_cutpaste(void* dest, const void* src, size_t count, size_t buf_total_size) { // 执行内存移动,自动处理地址重叠 memmove(dest, src, count); // 计算需要清0的区域:从目标数据的末尾开始,到缓冲区结束的部分 char* buf_base = static_cast<char*>(dest); size_t clear_start = count; size_t clear_len = buf_total_size - clear_start; if (clear_len > 0) { memset(buf_base + clear_start, 0, clear_len); } }
调用示例(修正原代码的字符初始化问题)
原代码中直接将char(i)赋值给数组元素会得到ASCII控制字符,而非数字字符,这里修正后再调用自定义函数:
char *arr = new char[8]; // 初始化arr[2]到arr[5]为数字字符'2'到'5' for ( int i = 2; i <= 5; i++ ) { arr[i] = '0' + i; } // 调用剪切粘贴函数:目标地址arr,源地址arr+2,复制4个字节,缓冲区总大小8 mem_cutpaste(arr, arr + 2, 5 - 2 + 1, 8);
注意事项
- 如果你的“剪切”需求不是清理整个缓冲区的冗余部分,而是仅清理源位置的残留数据,需要根据源地址和目标地址的相对位置计算清理范围:
- 当源地址
src大于目标地址dest(向前移动):需清理从src开始到缓冲区末尾的部分; - 当源地址
src小于目标地址dest(向后移动):源位置的前count字节已被覆盖,无需额外清理。
- 当源地址
- 必须保证传入的缓冲区总大小
buf_total_size准确,避免出现越界访问的安全问题。
内容的提问来源于stack exchange,提问作者PkDrew
相关产品推荐
相关产品推荐

