memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
memmove用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
在我实现这两个函数时,分别用了两种实现方式,但是基本思想都是相同的。
memcpy(1)
#define _CRT_SECURE_NO_WARNINGS 14
#include<stdio.h>
#include <assert.h>
void* my_memcpy(void* dest,const void* src,size_t count)
{
void *ret = dest;
assert(dest!=NULL);
assert(src !=NULL);
while(count--){
*(char*)dest = *(char*)src;
src = (char *)src+1;
dest = (char *)dest+1;
}
return ret;
}
int main(){
char arr[10];
char arr1[]={1,2,3,4,5,6,7,8,9,0};
my_memcpy(arr,arr1,10);
return 0;
}
memcpy(2)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <assert.h>
void* my_memcpy(void* dest,const void* src,size_t count)
{
char* pdest = (char*)dest;
char* psrc = (char*)src;
assert(dest!=NULL);
assert(src!=NULL);
while (count--)
{
*pdest++ = *psrc++;
}
return dest;
}
int main()
{
char arr[10];
char arr1[]={1,2,3,4,5,6,7,8,9,0};
my_memcpy(arr,arr1,10);
return 0;
}
memcpy中要注意的是从void 转换到char时的转换,要想到这点。
memmove
重点是memmove的实现,有两种方法,分别对应两种实现代码,下面用图表示出来
实现代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <assert.h>
void* my_memmove(void* dest,const void* src,size_t count)
{
void* ret = dest;
assert(dest!=NULL);
assert(src!=NULL);
//从前向后
if(dest<src)
{
while(count--)
{
*(char *)dest = *(char*)src;
dest = (char*)dest+1;
src = (char *)src+1;
}
}
//从后向前
else
{
while (count--)
{
*((char*)dest+count)=*((char*)src+count);
}
}
return ret;
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,0};
memmove(arr,arr+2,16);
return 0;
}
memmove第二种实现方式,如下图所示:
实现代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <assert.h>void* my_memmove(void* dest,const void* src,size_t count)
{
void* ret = dest;
assert(dest!=NULL);
assert(src!=NULL);
if((dest>src)&&((char*)dest<((char*)src+count)))
{
while (count--)
{
*((char*)dest+count)=*((char*)src+count);
}
}
else
{
while(count--)
{
*(char *)dest = *(char*)src;
dest = (char*)dest+1;
src = (char *)src+1;
}
}
return ret;
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,0};
memmove(arr,arr+2,16);
return 0;
}
运行结果也是相同的:
如上就是我所学习到的memcpy,memmove的全部实现方法。