C++memcpy和memcpy_s


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

C++memcpy和memcpy_s

 

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);

C++memcpy和memcpy_s

 

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

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/277810.html

(0)
上一篇 2022年7月30日
下一篇 2022年7月30日

相关推荐

发表回复

登录后才能评论