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