本文介绍了memcpy函数的使用与模拟实现。memcpy用于将源地址的指定字节数数据复制到目标地址,示例展示了其基本用法。模拟实现通过类型转换逐字节复制数据。当源地址和目标地址存在重叠时,建议使用memmove函数,其模拟实现根据地址关系选择从前向后或从后向前复制。文章还简要提及memset设置内存内容和memcmp比较内存区域的功能。这些内存操作函数都需要注意地址重叠问题,确保数据正确复制。

memcpy使⽤和模拟实现

首先要知道memncpy是干什么的
参数功能   参数类型   返回值
函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
#include<string.h>
int main()
{
    int a1[20] = { 0 };
    int a2[5] = { 0,2,2,2,2 };
    memcpy(a1+3, a2+2, 20);
    for (int i = 0; i < 5; i++)
    {
        printf("%d ", a1[i]);
    }
    return 0;
}

模拟实现

#include<string.h>
void my_memcpy(void* a1, void * a2, size_t num)
{

a1=ret;
    while (num--)
        //每执行一次num减一次
    {
        //void指针类型不能直接计算需要转换类型
        *(char*)a1 = *(char*)a2;
        (char*)a1 = (char*)a1 + 1;
        (char*)a2 = (char*)a2+1;

    }

return 0;

}
int main()
{
    int a1[20] = { 0 };
    int a2[5] = { 0,2,2,2,2 };
    //memcpy(a1+3, a2+2, 20);
    my_memcpy(a1, a2, 20);
    for (int i = 0; i < 5; i++)
    {
        printf("%d ", a1[i]);
    }
    return 0;
}

如果source和destination有任何的重叠,复制的结果都是未定义的

空间的重叠会导致源空间复制到目标空间的值被覆盖

出现覆盖空间我们就要用memmove函数

memmove函数

memmove 模拟实现

我们先分析  有三种情况 从前向后  从后往前  空间不重叠  三种

而这三种可以当作两种来处理

void my_memmove(void *a1,void *a2,size_t num)

{

char d = (char*)a1;

//从前向后

if(a1<a2)

while (num--)

{

*(char*)a1 = *(char*)a2;

(char*)a1 = (char*)a1 + 1;

(char*)a2 = (char*)a2 + 1;

}

else

{

*((char*)a1 + num) = *((char*)a2 + num);

}

return d;

}

int main()

{

int a1[20] = { 1 ,1,2,3,4};

memmove(a1+2, a1, 20);

for (int i = 0; i < 5; i++)

{

printf("%d ", a1[i]);

}

return 0;

}

memset函数

把对应的字节数的内容设置想成为的内容

memcmp函数

比较源位置和目标位置向后的n个字节

                                                                                                                                                                                                                                           

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐