• (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的区别以及模拟实现

  • 相关阅读:
    java计算机毕业设计springboot+vue软件工程课程建设学习网站
    leetcode刷题
    【C语言】算法学习·最小表示法
    普法Android.mk中的一些宏和Android.bp对应关系
    Java设计模式之门面模式(Facade Pattern)
    ICCV2021|你以为这是一个填色模型?其实我是检索模型!
    记一次问题排查
    ai智能外呼机器人的功能,机器人对话常用语模板搭建
    C++征途 --- STL常用算法(上)
    PHP 危险函数2-代码执行语句
  • 原文地址:https://blog.csdn.net/m0_72018048/article/details/126842848