• 内存操作函数


    目录

    学习目标:

    学会使用内存操作函数memcpy、memmove、memcmp并自主实现

    学习内容:

    1.1.1 memcpy函数介绍

    1.1.2 自主实现memcpy函数

    1.2.1 memmove函数

    1.2.2 自主实现memmove函数

    1.3.1 memcmp函数

    1.3.2 自主实现memcmp函


    学习目标:

    学会使用内存操作函数memcpy、memmove、memcmp并自主实现


    学习内容:

    !!!!!!!注:建议与主页的字符串函数对比学习!!!!!!!

    1.1.1 memcpy函数介绍

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

    函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置,返回目的空间的起始地址。注:该函数遇到‘\0’时并不会停下来,如果source和destination有任何的重叠,复制的结果都是未定义的。

    它与之前的字符串函数strncpy的区别是字符串函数仅仅能操作字符串,而它能操作任意类型,因为它是在内存层面拷贝的。

    1.1.2 自主实现memcpy函数

    它的实现原理与函数strncpy类似,但因为它可以操作任意类型所以指针类型为通用型指针void*,注意通用型指针不可以解引用和++、--操作,所以将其强类型转换。

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. void* my_memcpy(void* dest, const void* src, size_t num)
    5. {
    6. void*ret = dest; //记录目的空间的起始位置
    7. assert(dest&&src);
    8. while (num--)
    9. {
    10. *(char*)dest = *(char*)src;
    11. ++(char*)dest;
    12. ++(char*)src;
    13. }
    14. return ret;
    15. }

    1.2.1 memmove函数

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

    它的功能与memcpy一样也是从source的位置开始向后复制num个字节的数据到destination的内存位置,返回目的空间的起始位置,但不一样的是它可以操作source和destination重叠的情况。如:1 2 3 4 5 6 7 将里面的1234复制到4 5 6 7的位置上。

    1.2.2 自主实现memmove函数

    分析:将1234复制到4567中时,如果先将1复制到4中会丢失了4,所以要从后面开始将4复制到7中再到3->6等等。那假如是4567复制到1234时,如果从后面开始的话7->4,那么4会丢失,所以要改为4复制到4中,5->3等等。所以实现时要分成两种情况。

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. void* my_memmove(void* dest, const void* src, size_t num)
    5. {
    6. void* ret = dest;
    7. assert(dest&&src);
    8. if (dest < src) //从前面复制到后面
    9. {
    10. while (num--)
    11. {
    12. *(char*)dest = *(char*)src;
    13. ++(char*)dest;
    14. ++(char*)src;
    15. }
    16. }
    17. else
    18. {
    19. while (num--)//从后面复制到前面
    20. {
    21. *((char*)dest + num) = *((char*)src + num);
    22. }
    23. }
    24. return ret;
    25. }

    1.3.1 memcmp函数

    int memcmp ( const void * ptr1,const void * ptr2,size_t num );

    该函数比较从ptr1和ptr2指针开始的num个字节,与strncmp类似,返回值也相同。不同的是它在内存层面操作,可以操作任意类型。

    1.3.2 自主实现memcmp函数

    实现与strccmp类似。

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. int my_memcmp(const void * ptr1, const void * ptr2, size_t num)
    5. {
    6. assert(ptr1&&ptr2);
    7. char* dest = (char*)ptr1;
    8. char* src = (char*)ptr2;
    9. //比较
    10. while (num && (*dest == *src))
    11. {
    12. dest++;
    13. src++;
    14. num--;
    15. }
    16. if (!num || ((*dest) && (*src))) //num个字符或者字符都比较完时
    17. {
    18. return 0;//完全相等时
    19. }
    20. return(*dest - *src);
    21. }

     争取每次学习都能掉十根头发,不掉头发的程序员不是好程序员。

                                                                                                             ——Ace Young

  • 相关阅读:
    java锁之ReentrantLock及Condition
    vue3自定义指令看完就入门!
    三次握手、四次挥手的详细过程
    阿里P9整理出千页笔记:Java程序设计与数据结构基础+进阶
    Spring Kafka—— KafkaListenerEndpointRegistry 隐式注册分析
    Git教程1:生成和提交SSH公钥到远程仓库
    PMP_第3章章节试题
    【电商项目实战】上传头像(详细篇)
    2023最新最全【内网渗透工具】零基础安装教程
    使用fdatool工具箱设计滤波器及工程应用
  • 原文地址:https://blog.csdn.net/ACE_YOUNG/article/details/125944460