【C】内存函数及其模拟实现 —— memcpy | memmove | memcmp

简介: memcpy | memmove | memcmp

@TOC

:star:本文将介绍 内存操作函数,及重点函数的 模拟实现

正文开始@一个人的乐队

1.memcpy

相较于之前介绍过的strcpy只能拷贝字符串,memcpy可以拷贝任意类型,整型浮点型结构体类型等等都可以。
在这里插入图片描述
:green_heart:
在这里插入图片描述
上代码感受它的使用:

#include<stdio.h>
#include<string.h>

int main()
{
    int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int arr2[20] = { 0 };

    //拷贝的是整型数据
    memcpy(arr2, arr1, sizeof(int)* 10);

    int i = 0;
    for (i = 0; i < 20; i++)
    {
        printf("%d ", arr2[i]);
    }
    printf("\n");
    return 0;
}

在这里插入图片描述

:innocent: memcpy的模拟实现 my_memcpy
#include<stdio.h>
#include<assert.h>

void* my_memcpy(void* dest, const void* src, size_t count)
{
    assert(dest&&src);//断言
    void* ret = dest;
    while (count--)
    {
        *(char*)dest = *(char*)src;
        dest = (char*)dest + 1;
        src = (char*)src + 1;
    }
    return ret;
}

int main()
{
    int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int arr2[20] = { 0 };
    my_memcpy(arr2, arr1, sizeof(int)* 10);
    int i = 0;
    for (i = 0; i < 20; i++)
    {
        printf("%d ", arr2[i]);
    }
    return 0;
}

这里有几处小注意,我还是标注在代码旁:
在这里插入图片描述

2.memmove

:star:内存拷贝时,出现重叠现象的时候要用 memmove

:yellow_heart:引例:

若用my_memcpy来完成有重叠的内存拷贝:

#include<stdio.h>

void* my_memcpy(void* dest, const void* src, size_t count)
{
    assert(dest&&src);//断言
    void* ret = dest;
    while (count--)
    {
        *(char*)dest = *(char*)src;
        dest = (char*)dest + 1;
        src = (char*)src + 1;
    }
    return ret;
}

int main()
{
    int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    //这里用的是我刚刚自己模拟实现的函数
    my_memcpy(arr+2, arr, sizeof(int)* 4);

    int i = 0;
    for (i = 0; i < 10; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}

发现运行结果与预期不符:
在这里插入图片描述
:snowflake:这种情况下,可以从源字符串的末尾下手,从后向前一个一个字节拷:
在这里插入图片描述

:innocent: 模拟实现--- :snowflake:思路 + :snowflake:代码

根据srcdest的位置关系的不同情况,有不同的拷贝方式:
:snowflake:情况一
在这里插入图片描述
:snowflake:情况二
在这里插入图片描述
:snowflake:情况三: 没有重叠内存空间,爱咋拷咋拷
在这里插入图片描述
那么后两种情况可以合并,都采用从源数据的末尾下手,从后往前拷。

#include<stdio.h>
#include<assert.h>

void* my_memmove(void* dest, const void* src, size_t count)
{
    assert(dest&&src);
    void* ret = dest;
    if (dest < src)
    {
        //前-->后
        while (count--)
        {
            *(char*)dest = *(char*)src;
            dest = (char*)dest + 1;
            src = (char*)src + 1;
        }
    }
    else
    {
        //后-->前
        while (count--)
        {
            *((char*)dest + count) = *((char*)src + count);
        }
    }
    return ret;
}

int main()
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    my_memmove(arr+2, arr , 16);
    //my_memmove(arr, arr+2, 16);
    return 0;
}

还是把几个要注意的点标注在代码旁:
在这里插入图片描述

调试:
在这里插入图片描述


拉回到最开始的引例,小边采取了my_memcpy,而没有使用库函数memcpy,是因为vs的memcpy很nb,也可以实现内存重叠的拷贝。
相当于我让你考60分,结果你考了100分,不管怎样,只要完成了内存不重叠的拷贝就算完成任务。
:blue_heart:将来,最好还是,该用memcpy时用memcpy,该用memmove时用memmove.

3.memcmp

:star: 内存比较函数(一个字节一个字节比较)

:green_heart:
在这里插入图片描述
在这里插入图片描述
上代码感受它的使用:

#include<stdio.h>
#include<string.h>

int main()
{
    int arr1[] = { 1, 2, 3, 4, 5 };
    int arr2[] = { 1, 2, 3, 6, 6 };
    int ret = memcmp(arr1, arr2, 13);
    printf("%d\n", ret);
    return 0;
}

在这里插入图片描述

相关文章
|
1月前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
|
1月前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
|
1月前
【C初阶】内存函数:memcpy+memmove+memset+memcmp
【C初阶】内存函数:memcpy+memmove+memset+memcmp
|
1月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
|
2月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
189 14
|
22天前
|
存储 监控 Docker
如何限制docker使用的cpu,内存,存储
如何限制docker使用的cpu,内存,存储
|
2月前
|
存储 固态存储 芯片
计算机中内存与存储
【7月更文挑战第28天】
33 1
|
2月前
|
存储 弹性计算 程序员
新手程序员如何阿里云服务器配置?新人开发者CPU内存带宽存储怎么选?
对于新手开发者、个人或学生选择阿里云服务器,推荐ECS经济型e实例(ecs.e-c1m1.large),适用于小型网站或轻量应用。配置2核2G内存、3M固定带宽、40G ESSD系统盘,仅99元/年且续费同价。
|
1月前
|
存储 编译器 C语言
数据在内存中的存储
数据在内存中的存储
|
2月前
|
存储 Java 程序员
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
54 10

热门文章

最新文章