memcpy使用&模拟实现

107 阅读2分钟

「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战

memcpy函数和memmove函数的区别

C语言库函数中,二者都可以进行重叠和不重叠的内存拷贝

但是C语言标准只规定了memcpy函数可以实现内存不重叠的问题即可,内存重叠的问题交给memmove函数处理


memcmp:内存比较函数

image-20220209221422440

比较前count个字节

image-20220209221429254


使用strcmp()只能比较字符串,而memcmp()可以比较整形,也可以比较字符串

int main()
{
    int arr1[] = {1,2,3,4};
    //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
    int arr2[] = {1,2,3,5};
    //01 00 00 00 02 00 00 00 03 00 00 00 05 00 00 00
    int ret = memcmp(arr1,arr2,12);
    //比较前12个字节,二者相同,返回0
    printf("%d\n",ret);//0
    ret = memcmp(arr1,arr2,13);
    //比较前13个字节,arr1中的04比arr2中的05小,返回-1
    printf("%d\n",ret);	//-1
}

模拟实现memcmp()

注意:由于不知道传过来的是什么类型->使用void*类型接收,由于要比较的字节数恒大于0,所以用size_t接收,

由于只知道要比较的字节数,不知道是什么类型->所以使用char* 一个字节一个字节的向后比较,直到找到二者中字节对应内容不相等时,比较此时二者字节内容

int my_memcmp(const void* p1, const void* p2, size_t count)
{
    assert(p1 && p2);
    while (count--)
    {
        //如果二者指向的一个字节内容相等->指向下一个字节
        if (*(char*) p1 == *(char*)p2)
        {
            p1 = (char*)p1+1;
            p2 = (char*)p2+1;
        }
        else
        {
            //此时二者指向的字节内容不相同
            //通过强转为char* 比较此时二者指向的一个字节内容
            if ((*(char*)p1 - *(char*)p2) > 0)
            {
                return 1;
            }
            else
            {
                return -1;
            }
        }
    }
    //跳出循环时,count = 0,说明二者要比较的字节的内容都相同
        return 0;

}
int main()
{
    int arr1[] = { 1,2,3,4 };
    //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
    int arr2[] = { 1,2,3,99 };
    //01 00 00 00 02 00 00 00 03 00 00 00 05 00 00 00
    int ret = my_memcmp(arr1, arr2, 12);
    //比较前12个字节,二者相同,返回0
    printf("%d\n", ret);    //0
    ret = my_memcmp(arr1, arr2, 13);
    //比较前13个字节,arr1中的04比arr2中的05小,返回-1
    printf("%d\n", ret);    //-1
    char* p1 = "Mangopp";
    char* p2 = "Mangoppp";
    ret = memcmp(p1, p2, 8);
    printf("%d\n", ret);    //-1
}