ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++memcpy和memcpy_s

2022-07-29 19:35:27  阅读:131  来源: 互联网

标签:src dst C++ char void len memcpy


memcpy_s是memcpy的安全用法。_CRT_MEMCPY_S_VALIDATE_RETURN_ERRCODE的用处是做安全校验,如果不满足就返回异常码,其实底层还是memcpy的使用。

 

char* s = new char[3]{'1','2' ,'3' };
    char* d=new char[12];
    ::memcpy(d, s + 0, 1);// d 1
    ::memcpy(d, s + 1, 2);// d 23
    ::memcpy(d, s + 0, 3);// d 123

 用习惯了C#,当需要public static void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length);这个方法的时候,没有任何相关的。这是c++内部对于内存拷贝的源码。

void *memcpy(void *dst, const void *src, size_t len)
{
    if(NULL == dst || NULL == src){
        return NULL;
    }
    
    void *ret = dst;
    
    if(dst <= src || (char *)dst >= (char *)src + len){
        //没有内存重叠,从低地址开始复制
        while(len--){
            *(char *)dst = *(char *)src;
            dst = (char *)dst + 1;
            src = (char *)src + 1;
        }
    }else{
        //有内存重叠,从高地址开始复制
        src = (char *)src + len - 1;
        dst = (char *)dst + len - 1;
        while(len--){
            *(char *)dst = *(char *)src;
            dst = (char *)dst - 1;
            src = (char *)src - 1;
        }
    }
    return ret;
}

增加一个索引变量。

void* memcpy_1(void* dst, size_t ind, const void* src, size_t len)
{
    if (NULL == dst || NULL == src) {
        return NULL;
    }

    void* ret = dst;

    if (dst <= src || (char*)dst+ind >= (char*)src + len) {
        //没有内存重叠,从低地址开始复制
        while (len--) {
            *((char*)dst+ind) = *(char*)src;
            dst = (char*)dst + 1;
            src = (char*)src + 1;
        }
    }
    else {
        //有内存重叠,从高地址开始复制
        src = (char*)src + len - 1;
        dst = (char*)dst + len - 1;
        while (len--) {
            *((char*)dst + ind) = *(char*)src;
            dst = (char*)dst - 1;
            src = (char*)src - 1;
        }
    }
    return ret;
}

下面进行测试,内存有堆叠的方案,目前没有测试。

char* s = new char[3]{'1','2' ,'3' };
char* d=new char[12];
memcpy_1(d,1, s + 1, 2);

 

 第一个内存地址是目标,第二个内存是源,从内存里看是没有问题的。

标签:src,dst,C++,char,void,len,memcpy
来源: https://www.cnblogs.com/zjr0/p/16532753.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有