实现memcpy( )和memmove( )函数

来源:互联网 发布:大学网络诋毁严正声明 编辑:程序博客网 时间:2024/06/06 04:15

**

1.实现memcpy()函数

**
memcpy()为字节拷贝函数,他能拷贝任意类型的数组,是根据内存中的二进制码依次进行拷贝的。由于字符串拷贝函数strcpy()的结束标志是0,假如我们现在有int arr1[] = { 4, 2, 3, 4 };int arr2[] = {1,3,4,6}; 利用strcpy((char )arr1, (char )arr2);则输出的不是1,3,4,6 。因为一个整型数字占4个字节,也就是32个比特位,一个字符串占1个字节,8个比特位。strcpy是按照字节依次拷贝的,当遇到‘\0’时结束拷贝。这样1后面的0就会被当作字符串结束标志处理,所以把1拷贝进去后,将不会继续拷贝。我们来看下面的代码验证:

#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){    int arr1[] = { 4, 2, 3, 4 };    int arr2[] = {1,3,4,6};    strcpy((char *)arr1, (char *)arr2);    for (int i = 0; i < 4;i++)    printf("%d ",arr1[i]);    system("pause");    return 0;}

我的结果是:

接下来,我们就来实现memcpy()函数:

#include<stdio.h>#include<stdlib.h>#include<assert.h>void * my_memcpy(void *des, const void *src, size_t n){    assert(des);    assert(src);    char *pdes = (char *)des;    char *psrc = (char *)src;    void *ret = des;    while (n)    {        *pdes++ = *psrc++;        n--;    }    return ret;}int main(){     int des[30] = { 4, 2, 3, 4 };    int src[] = { 1, 3, 4, 6 };    int i = 0;    my_memcpy(des, src,sizeof(src));    for (i = 0; i < sizeof(src) / sizeof(src[0]);i++)    {        printf("%d ", des[i]);    }    printf("\n");    system("pause");    return 0;}

这里写图片描述

但是,当我们需要拷贝的字符串有内存重叠的时候,比如源字符串是目标字符串的一部分,则这时候会丢失数据,无法得到正确的结果(如下图所示)。此时,就需要用到memmove()函数进行拷贝。

#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){     char p[256] = "hello world!";    memcpy(p, p+5,strlen(p));    printf("%s\n", p);    system("pause");    return 0;}

这里写图片描述

**

2.实现memmove()函数

**
下面我们来实现自己的memmove()函数:

#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>void *my_memmove(void *des, void *src, size_t count){    assert(des);    assert(src);    void *ret = des;    //从前往后拷贝    if ((des <= src) || (char *)des >= (char *)src + count)    {        while (count--)        {            *(char *)des = *(char *)src;            (char *)des = (char *)des + 1;            (char *)src = (char *)src + 1;        }    }    else        //从后往前拷贝    {        des = (char *)des + count - 1;        src = (char *)src + count - 1;        while (count--)        {            *(char *)des = *(char *)src;            (char *)des = (char *)des - 1;            (char *)src = (char *)src - 1;        }    }    return ret;}int main(){    char arr1[30] = "abcdefgh";    printf("用字符串测试:");    char *ret1=my_memmove(arr1 + 5, arr1, strlen(arr1) + 1);    printf("%s\n", ret1);    int arr2[30] = { 1, 3, 5, 7, 9 };    printf("\n用整型数组测试:");    int *ret2 = my_memmove(arr2 + 3, arr2, 5 * sizeof(int));    int i = 0;    for (i = 0; i < 5; i++)    {        printf("%d ", ret2[i]);    }    printf("\n\n");    system("pause");    return 0;}

这里写图片描述

0 0
原创粉丝点击