• (memcpy,memmove...)内存函数还不会??别怕,我来助你一臂之力


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    在c语言的学习过程中,我们将不可避免的遇到内存函数,今天就让我们来学习一下内存函数的应用!!!


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、内存函数是什么

    内存函数是通过访问地址的方式操作对象(不必担心地址所对应的数据类型)可应用于任何类型的对象。

    二、内存函数的分类(常见)

    1.memcpy

    void * memcpy ( void * destination, const void * source, size_t num );

    1. 函数memcpy从指针source开始往下拷贝num个字节的数据到destination所对应的空间
    2. 此函数在遇到‘\0’是不会停下,仍会自动拷贝
    3. 如果source和destination有所重叠,那么复制的结果都是未定义的
    4. memcpy函数的传参对象都是void类型,因此可以拷贝任意数据类型

    memcpy的模拟实现

    思路:

    1.         传递的执政不为NULL,所以用assert控制
    2.         因为不确定传递的指针个数,所以最稳妥的方法就是一个个传递,所以需要强制转化为          char*类型
    3.         arr2的值会变化,所以要将其开始的值赋值给一个void*类型的变量,最后返回它
    1. #include<stdio.h>
    2. #include<assert.h>
    3. void* my_memcpy(void* arr2, const void* arr1,size_t num)
    4. {
    5. assert(arr2 && arr1);
    6. void* p = arr2;
    7. while (num--)
    8. {
    9. *(char*)arr2 = *(char*)arr1;
    10. arr2 = (char*)arr2 + 1;
    11. arr1 = (char*)arr1 + 1;
    12. }
    13. return p;
    14. }

    2.memmove

    void * memmove ( void * destination , const void * source , size_t num );
    • memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
    • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

     memmove的模拟实现

    思路:

    1.         传递的执政不为NULL,所以用assert控制
    2.         因为不确定传递的指针个数,所以最稳妥的方法就是一个个传递,所以需要强制转化为          char*类型
    3.         分类讨论,视情况而定,要用到分支语句。

    1. void* my_memmove(void* arr2, const void* arr1, size_t num)
    2. {
    3. assert(arr1 && arr2);
    4. void* p = arr2;
    5. if (arr2 < arr1)
    6. {
    7. while (num--)
    8. {
    9. *((char*)arr2 + num) = *((char*)arr1 + num);
    10. }
    11. }
    12. else
    13. {
    14. assert(arr2 && arr1);
    15. void* p = arr2;
    16. while (num--)
    17. {
    18. *(char*)arr2 = *(char*)arr1;
    19. arr2 = (char*)arr2 + 1;
    20. arr1 = (char*)arr1 + 1;
    21. }
    22. }
    23. return p;
    24. }

    3.memset

    void *memset(void *ptr, int value, size_t n);

    ptr:指向要填充的内存块的指针。

    value:要设置的值。该值以 int 形式传递,但该函数使用此无符号 char 转换来填充内存块

    size_t:字节数,无符号整型。

    与strcpy的区别是:strcpy是复制,而memset是替换!!!

    模拟实现:

    思路:传递的执政不为NULL,所以用assert控制

               因为不确定传递的指针个数,所以最稳妥的方法就是一个个传递,所以需要强制转化为          char*类型

    1. #include
    2. #include
    3. void* my_memset(void* ptr, int value, size_t num)
    4. {
    5. assert(ptr);
    6. void* p = ptr;
    7. while (num--)
    8. {
    9. *((char*)ptr) = (char) value;
    10. ptr = (char*)ptr + 1;
    11. }
    12. }

    4.memcmp

    int memcmp ( const void * ptr1 , const void * ptr2 , size_t num );
    比较从 ptr1 ptr2 指针开始的 num 个字节
    返回值如下:

    总结

    内存函数的简单介绍!!!以及memcpy,memset,memmove的区别以及模拟实现

  • 相关阅读:
    2021年下半年信息安全工程师上午真题及答案解析
    微擎模块 砍价宝小程序 6.4.0全开源版安装更新一体包 砍价抢购拼团模式商家入驻
    Draco - glTF模型压缩利器
    Python 自然语言处理 文本分类 地铁方面留言文本
    基于 SpringBoot + Mybatis 的个人在线音乐平台
    【网络安全】--win提权
    网页【CSS】滚动条
    【面试题总结】分布式锦集
    INC公司和LLC公司的区别
    2022-08-03 C++并发编程(六)
  • 原文地址:https://blog.csdn.net/m0_72018048/article/details/126842848