memcpy:
用途:Copies characters between buffers.两块内存拷贝
函数原型:void *memcpy( void *dest, const void *src, size_t count );
- 从src的位置开始向后赋值count个字节的数据到dest的内存位置。
- 遇到‘\0’不会停下来。解决了strcpy遇到’\0’停下的缺陷。
- 两块内存不能有重叠,否则结果是未知的。
模拟实现:
//任意类型的指针都可以传,所以就不能直接运算,不能解引用
void* my_memcpy(void *dest, const void *src, int count)
{
void *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (count--)
{
*(char*)dest = *(const char*)src;//强制类型转换为char *型,在解引用
dest = (char*)dest + 1; //++(char *)dest;强制类型转换不能用于后置++
src = (char*)src + 1; //++(char *)src;
}
return ret;
}
int main()
{
int i = 0;
char arr2[10] = { 0 };
char arr1[20] = "abcdef";
my_memcpy(arr2, arr1, 10);
for (i = 0; i < 10; i++)
{
printf("%c ", arr2[i]);
}
system("pause");
return 0;
}
memmove:
用途:Moves one buffer to another.
函数原型:void *memmove( void *dest, const void *src, size_t count );
- 和memcpy的差别就是memmove函数处理的源内存卡和目标内存块是可以重叠的。
- 如果出现重叠,就只能用memmove函数处理。
接下来要分情况讨论了,
如果dest在src的左边的话,那么src要从左向右去拷贝到dest空间中;
如果dest在src的右边的话,src要从右向左拷贝到dest空间中,否则会覆盖src中后边空间的内容
模拟实现:
void *my_memmove(void *dest, const void *src, int count)
{
void *ret = dest;
assert(dest != NULL);
assert(src != NULL);
if (dest < src)
{
//左->右
printf("%d\n", count);
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (count--)//15
{
*((char *)dest + count) = *((char *)src + count);//dest加count是第16个字节的地址
}
}
}
int main()
{
int i = 0;
int arr1[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
my_memmove(arr1 + 2, arr1, 16);
for (i = 0; i < 9; i++)
{
printf("%d ", arr1[i]);
}
system("pause");
return 0;
}