您的位置:首页 > 其它

内存拷贝的实现.c

2017-01-05 23:04 225 查看
/*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;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: