内存拷贝的实现.c

/*memcpy函数的实现
 *memcpy是内核提供的机制,应用C编写(linux内核由C编写)
 *strcpy只提供字符串的拷贝,memcpy可以实现任意类型的拷贝
 */

# include <stdio.h>
# include <stdlib.h>

void* Memcpy(void *dst, const void *src, int len) //destination 目的 source 源 length 长度 该长度按字节算,一个int为len = 4
    {
    char *psrc;
    char *pdst;
    if(dst == NULL || src == NULL || len == 0) //dst需提前申请内存
    {
printf("内存错误!\n");
        return NULL;
    }
    if((src < dst) && (char *)src + len > (char *)dst) //判断内存空间是否重叠,src<det,即src在前,src+len>dst即有重叠(src与dst必须以字节为单位)
    {
        printf("\033[31m001  \033[0m");
        psrc = (char *)src + len - 1; //psrc指向src的末尾
        pdst = (char *)dst + len - 1;
        while(len--) 
        {
            *pdst-- = *psrc--; //从后向前复制
        }
    }
    else
    {
        printf("\033[32m002  \033[0m");
        psrc = (char *)src;//psrc指向src的起始位
        pdst = (char *)dst;
        while(len--)
        {
            *pdst++ = *psrc++;//从前向后复制
        }
    }
    return dst;
}
void show(int* arrary,int n){
    for (int i = 0;i<n;i++){
    printf("%d ", arrary[i]);
    }
    printf("\n");
}
int main()
{
    char buf1[100] = "abcdefghijk";
    char buf2[20] = {'\0',};
    Memcpy(buf2, buf1, 5);
    printf("buf2 : %s\n", buf2);

    int buf3[10] = {9,8,7,6,5,4,3,2,1,0};
    int* buf4 = (int*)malloc(sizeof(int[10]));
    int* buf5 = (int*)malloc(sizeof(int[5]));
    int buf6[20] = {0,};
    Memcpy(buf4, buf3, 40);
    printf("buf4 : ");
    show(buf4,10);
    Memcpy(buf5, buf3, 20);
    printf("buf5 : ");
    show(buf4,5);
    free(buf4);
    free(buf5);
    Memcpy(buf6, buf3, 40);
    printf("buf6 : ");
    show(buf6,10);
    Memcpy(buf6+4,buf6,40);
    printf("buf7 : ");
    show(buf6,10);
    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值