C手写内存不重叠/重叠拷贝函数

用C语言实现的内存拷贝函数的示例代码,包括使用标准函数库中的memcpymemmove函数,以及自定义的my_memcpymy_memmove函数。

memcpy函数用于在内存中拷贝一段数据,参数dest表示目的地(要粘贴的地方),src表示源头(要复制的地方),num表示要拷贝的字节数。memcpy函数适用于非重叠的内存拷贝。

my_memcpy函数是自定义的内存拷贝函数,与memcpy功能相同,可以处理非重叠的内存拷贝。通过逐个字节的复制,将源数据复制到目标地。

memmove函数用于在内存中拷贝一段数据,与memcpy功能相似,但可以处理重叠的内存拷贝。如果目标地址和源地址有重叠部分,则根据地址的前后关系选择不同的拷贝方式。

my_memmove函数是自定义的内存拷贝函数,与memmove功能相同,可以处理重叠的内存拷贝。根据目标地址和源地址的前后关系,选择不同的拷贝方式。

在示例代码中,分别使用memcpymy_memcpy函数将数组arr1的内容拷贝到数组arr2中,并输出结果。

接下来,使用memmovemy_memmove函数将数组arr5的内容拷贝到arr5+3的位置,并输出结果。

请注意,这只是一个示例代码,用来演示内存拷贝函数的使用。实际使用时,需要根据具体情况进行适当的参数校验和错误处理。

#include
#include
#include

//函数拷贝结束后会返回目标空间的地址,不重叠拷贝
void* my_memcpy(void* dest,const void * src,size_t num) 
{
    void* ret = dest;
    assert(src&&dest);
    while(num--)
    {
        *(char*)dest = *(char*)src;
        //++(char*)dest;
        //++(char*)src;
        dest = (char*)dest + 1;
        src = (char*)src + 1;
    }

    return ret;
}

//重叠拷贝
void* my_memmove(void* dest, const void* src, size_t num)
{
    void* ret = dest;
    assert(src && dest);
    //如果dest和src有交集,要考虑指针的前后问题
    //dest>src 后->前拷贝
    //dest后拷贝

    if (dest     {
        while (num--)
        {
            *(char*)dest = *(char*)src;
            dest = (char*)dest + 1;
            src = (char*)src + 1;
        }
    }
    else 
    {
        while (num--) 
        {
            *((char*)dest + num) = *((char*)src + num);
        }
    }

    return ret;
}

int main() 
{
    //memcpy内存拷贝函数:用来处理不重叠的内存拷贝
    //返回值:void*
    //参数:void* dest目的地(粘贴的地方),void* src源头(复制的地方),size_t num字节大小
    //遇到/0不会停

    int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
    int arr2[20] = { 0 };
    //将arr1的内容,拷贝到arr2中
    memcpy(arr2,arr1,40);
    int i = 0;
    for (i=0;i<20;i++) 
    {
        printf("%d\n",arr2[i]);
    }
    //手动实现内存拷贝函数
    int arr3[] = { 1,2,3,4,5,6,7,8,9,10 };
    int arr4[20] = { 0 };
    my_memcpy(arr4,arr3,20);
    int j = 0;
    for (j=0;j<5;j++) 
    {
        printf(" %d\n",arr4[j]);
    }

    //memmove内存拷贝函数:用来处理重叠的内存拷贝
    //返回值:void*
    //参数:void* dest目的地,void* src源头,size_t num字节大小
    //遇到/0不会停

    int arr5[] = { 1,2,3,4,5,6,7,8,9,10 };
    //将arr5的内容,拷贝到arr5+3中
    memmove(arr5+3,arr5, 20);
    int k = 0;
    for (k = 0; k < 10; k++)
    {
        printf("  %d\n", arr5[k]);
    }
    //手动实现内存拷贝函数
    int arr6[] = { 1,2,3,4,5,6,7,8,9,10 };
    my_memmove(arr6+2, arr6, 20);
    int l = 0;
    for (l=0;l<10;l++) 
    {
        printf("   %d\n",arr6[l]);
    }
    return 0;
}

你可能感兴趣的:(c语言)