【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;
}

在这里插入图片描述

相关文章
|
4月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
314 15
|
11月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
407 6
|
4月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
1670 0
|
4月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
486 1
|
4月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
451 0
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
917 0
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
988 1

热门文章

最新文章