1.模拟实现memcpy()函数
void * memcpy ( void * destination, const void * source, size_t num );
~~这个函数memcpy从source的位置开始向后辅助num哥字节的数据到destination的内存位置
~~这个函数是在遇到‘\0’的时候并不会停下来。
~~如果source和destination有任何的重叠,赋值的结果都是未定义的。
1.1 参考代码
#include<assert.h>
#include<stdio.h>
void* my_memcpy(void* arr, const void* arr2, size_t n)
{
assert(arr && arr2);
while (n--)
{
*(char*)arr = *(char*)arr2;
arr = (char*)arr + 1;
arr2 = (char*)arr2 + 1;
}
}
int main()
{
int arr[10] = { 0 };
int arr2[] = { 1,2,3,4,5,6 };
my_memcpy(arr, arr2, 24);
for (int i = 0; i < 10; i++)
{
printf("%d", arr[i]);
}
return 0;
}
1.2运行结果
2.模拟实现memmove函数
void * memmove ( void * destination, const void * source, size_t num );
~~和memcpy的差别就是memmove函数处理的源内存块和目标内存块是重叠的
~~如果源内存空间和目标函数出现重叠,就得使用memmove函数的处理。
2.1参考代码
#include<assert.h>
#include<stdio.h>
void* my_memmove(void* det, const void* dis, size_t n)
{
assert(det && dis);
void* ret = det;
if (det < dis)
{
int i = 0;
for (i = 0; i < n; i++)
{
*(char*)det = *(char*)dis;
det = (char*)det + 1;
dis = (char*)dis + 1;
}
}
else
{
*((char*)det + n) = *((char*)dis + n);
}
return det;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr, arr + 2, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}