目录
void *memcpy(void *dest, const void *src, size_t n);
memcpy原形:include<stdio.h>
void *memcpy(void *dest, const void *src, size_t n);
意义为内存复制,将 src 拷贝 n 个字节(byte)到 dest 里,如果dest本来就有内容就将其覆盖掉。
1.momcpy可以将一个字符串拷贝到内存
2.momcpy目标覆盖源n个字节内存
momcpy实现:
void* my_memcpy(void* dest, const void* str, size_t num)
{
assert(dest && str);
void* p = dest;
while (num--)
{
*(char*)dest = *(char*)str;
dest = (char*) dest + 1;
str = (char*) str + 1;
}
return 0;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
int arr2[40] = { 0 };
my_memcpy(arr2, arr, 28);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d", arr2[i]);
}
return 0;
}
不过如果用memcpy实现mommove就还有个重叠问题,我用图简单描述一下:
注:产生这个重叠问题还是因为在一个指定内存空间大小里面进行拷贝覆盖。
下图vs2019所示:
下图描述问题:解决重叠并实现(mommove)
代码实现:vs2019momcpy函数就也包含了mommove函数也就是解决了重叠问题。
解决重叠并实现mommove
void* my_memmove(void* ion, void* sur, size_t num)
{
assert(ion && sur);
void* p = ion;
if (ion < sur)
{
while (num--)
{
*(char*)ion = *(char*)sur;
ion = *(char*)ion + 1;
sur = *(char*)sur + 1;前置转换后加1跳过一个字节。
}
}
else
{
*((char*)ion + num) = *((char*)sur + num);//取ion/sur首地址,强制转换char
}
return p;
}
int main()
{
int arr[40] = { 0,1,2,3,4,5,6,7,8,9 };
memmove(arr, arr + 2, 12);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
}