C 模拟memmove函数

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;
}

3.执行结果

这里写图片描述

猜你喜欢

转载自blog.csdn.net/K_A_Irving/article/details/80216002