函数原型:void * memcpy(void * dest, void * src, int n);
- 函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。
- 参数 :
- destin-- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
- source-- 指向要复制的数据源,类型强制转换为 void* 指针。
- n-- 要被复制的字节数。
- 返回值:
该函数返回一个指向目标存储区destin的指针。 - 功能:
从源source所指的内存地址的起始位置开始拷贝n个字节到目标destin所指的内存地址的起始位置中。 - 所需头文件
C++:#include < cstring >
应用说明:
- source和destin所指的内存区域可能重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove() 可以用来处理重叠区域。函数返回指向des的指针。
- memcpy() 的实现方法:
要考虑到,目标的起始地址在源空间内,出现内存覆盖的情况
//按照字节(Byte)拷贝实现的my_memcpy
void* my_memcpy(void* dst,const void* src,int n)
{
if (dst == NULL || src == NULL || n <= 0) {
return NULL;//void* 一定要有返回值 void可以没有返回值
}
char* pdst = (char *)dst;
char* psrc = (char *)src;
if (psrc < pdst && pdst < psrc + n) { //关键!如果出现内存覆盖的情况,就要从后向前copy
pdst = pdst + n - 1;
psrc = psrc + n - 1;
while (n--) {
*pdst = *psrc;
pdst--; psrc--;
}
}
else {
while (n--) {
*pdst = *psrc;
pdst++; psrc++;
}
}
return dst;
}
- 注:source和destin都不一定是数组,任意的可读写的空间均可。
strcpy 和memcpy 的区别:
- 复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
- 复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。