一,memcpy
-
关于memcpy函数
-
memcpy函数的原型为:
void *memcpy(void *dest, void *src, unsigned int count);
是在不相关空间中进行的可以将指定字节数的内容拷贝到目标空间的C库函数。返回值为一个指针。可以说memcpy函数是memmove函数的一个子函数。
模拟实现:
void * my_memcpy(void *dst, const void *sou, size_t num)
{
assert(dst != NULL);
assert(sou != NULL);
void *ret = dst;//用空类型来接收参数和返回参数
while (num--)
{
*(char *)dst = *(char *)sou;//因为不确定其参数类型,故将其强转为(char *)型用一个字节进行来计算
dst = (char *)dst + 1;
sou = (char *)sou + 1;
}
return ret;
}
int main()
{
char str1[] = "sbcdefghi";
char str2[] = "aabbcc";
int sz = sizeof(str2) / sizeof(str2[0]);
char *ret = my_memcpy(str1, str2, 5);
printf("%s \n", str1);
system("pause");
return 0;
}
如图:
二,memmove
-
关于memcpy函数
- memmove函数的原型为: ``void memmove( void dest, const void* src, size_t count );`它和memcpy函数的区别即在于该函数可以实现内存重叠区域的内容拷贝,若目标区域和源区域没有重叠,则功能和memcpy函数相同。
-
模拟实现图解:
-
当目标区域的首地址小于原区域的首地址时
当目标区域的首地址大于原区域的首地址小于源区域的末地址时
当目标区域首地址大于源区域整个空间时,无论是从前向后传值还是从后向前传值都可以。
void * my_memmove(void * dst, const void *sou, size_t count)
{
void *ret = dst;//ret为空类型
assert(dst != NULL);
assert(sou != NULL);
if (dst <= sou || (char *)dst >= ((char *)sou + count))
{
while (count--)
{
//从前向后拷贝
*(char *)dst = *(char *)sou;//一字节进行处理
dst = (char *)dst + 1;
sou = (char *)sou + 1;
}
}
else
{
while (count--)
{
//从后向前拷贝
*((char *)dst + count) = *((char *)sou + count);//count--已经完成减一,在这儿一定不要再减一
}
}
return (ret);
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 ,0};
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
my_memmove(arr + 3, arr ,4 * sizeof (int ));//把arr[0]到arr[3]拷贝到arr[3]之后的内存
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf(" \n");
system("pause");
return 0;
}
如图: