1.原型:void *memcpy(void *dest, const void *src,size_t size);
头文件:#include <string.h>;
功能:由src所指内存区域复制size个字节到dest所指内存区域。
说明:这里我们需要注意的是对于地址重叠的情况,标准库中的该函数的行为是未定义的。因此自己动手实现
memcpy()时就需要考虑地址重叠的情况。
2. 内存布局情况:
(1)源地址和目的地址不重叠;
low--------------->high(大端模式)src
|------------|
|-----------| |------------|dest dest
(2)源地址和目的地址重叠;
src
|---------------------|
|---------------------|
dest
3. 实现:
如果没有重叠,直接从源地址的开始方向复制;如果目标地址在源区域内(dest>src && dest从源地址的末尾开始反方
向复制。
4.源码:
#include <stdio.h>#include <string.h>
#include <stdlib.h>
void *my_memcpy(void *dest, const void *src, size_t size){
char *psrc;
char *pdest;
if(NULL == dest || NULL == src){
return NULL;
}
//目的地址和源地址重叠,从源地址的末尾方向开始拷贝
if((src < dest) && (char *)src + size > (char *)dest){
psrc = (char *)src + size - 1;
pdest = (char *)dest + size - 1;
while(size--)
{
*pdest-- = *psrc--;
}
}
//目的地址和源地址不重叠,从源地址的开始方向拷贝
else{
psrc = (char *)src;
pdest = (char *)dest;
while(size--)
{
*pdest++ = *psrc++;
}
}
return dest;}