You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现内存的“剪切粘贴”操作?是否有对应封装函数?

内存剪切粘贴的实现方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:00:07