1.模拟实现memcpy
函数memcpy与类型无关,按字节进行拷贝
•函数memcpy从src的位置开始向后复制num个字节的数据到dest的内存位置
•这个函数在遇到’\0’的时候并不会停下来
•如果src和dest有任何的重叠,复制的结果都是未定义的
以下是模拟实现memcpy函数:
#include <stdio.h>
#include <windows.h>
#include <assert.h>
void *my_memcpy(void *dest,const void *src, int count)
{
assert(dest);
assert(src);
assert(count > 0);
char *p = (char *)dest;
char *q = (char *)src;
while (count--)
{
*p++ = *q++;
}
return dest;
}
int main()
{
char arr[] = "abcdefg";
char buff[10];
my_memcpy(buff,arr,sizeof(arr));
printf("buff = %s\n", buff);
system("pause");
return 0;
}
结果如下:
2.模拟实现memmove
•和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
•如果源空间和目标空间出现重叠,就得使用memmove函数处理
以下是模拟实现memmove函数:
#include <stdio.h>
#include <windows.h>
#include <assert.h>
#include <string.h>
void *my_memmove(void *dest,const void *src, int size)
{
assert(dest);
assert(src);
//从右往左拷贝
char *p = (char *)dest;
char *q = (char *)src;
if ((char *)dest > (char *)src && (char *)dest < (char *)src + size)
{
p = p + size - 1; //指针指向最后一个元素
q = q + size - 1;
while (size--)
{
*p-- = *q--;
}
}
//从左往右拷贝
else
{
while (size--)
{
*p++ = *q++;
}
}
return dest;
}
int main()
{
char arr[20] = "abcdefg";
my_memmove(arr + 1, arr, strlen(arr) + 1);
printf("after arr = %s\n", arr);
system("pause");
return 0;
}
结果如下: