1.题目
实现memmove
2.程序代码
memmove用于从ori拷贝count个字节到obj,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后ori内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
若为这种情况obj比ori小,应采取从前向后赋值,若采取从后向前赋值,6和5会把3 4消除,没法再把3 4赋值到前面
这种情况应采取从后向前赋值,道理与前面一样,若从前向后赋值,3和4会把5 6消除,5 6没法赋值到7 8所在的位置,最后输出来的就是1 2 3 4 3 4 3 4 9 10
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
#include <assert.h>
void* my_memmove(void *obj, const void *ori, size_t count)
{
assert(obj);
assert(ori);
void *ret = obj;//建立一个临时变量存放obj的首地址
if (obj < ori)//当obj的首地址小于ori的首地址,从前向后赋值
{
while (count--)
{
*(char *)obj = *(char *)ori;
++(char *)obj;
++(char *)ori;
}
}
else//obj大于ori的情况
{
while (count--)
{
*((char *)obj + count) = *((char *)ori + count);
}
}
return ret;
}
void print(int arr[], int i)//打印数组的函数
{
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int i = 0;
my_memmove(arr, arr + 2, 12);
print(arr, i);
my_memmove(arr + 7, arr + 5, 12);
print(arr, i);
system("pause");
return 0;
}