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);
第一个内存地址是目标,第二个内存是源,从内存里看是没有问题的。
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/277810.html