码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【c语言】探索内存函数


    探索内存函数

    • memcpy函数
    • memmove函数
    • memset函数
    • memcmp函数:

    memcpy函数

    memcpy函数声明:

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

    将source空间下的num个字符复制到dest中去

    函数的使用:
    将字符数组a的5字节的字符复制到a1中去

    #include
    #include
    int main()
    {
        char a[] = {"abcde"};
        char a1[20] = {0};
        memcpy(a1,a,5);
        printf("%s",a1);
        return 0;
    }//最后输出abcde
    

    memcpy函数模拟实现:

    void* my_memcpy(void*dest,const void*src,size_t num)
    {
        char* ret = (char*)dest;
        while (num)
        {
            *(char*)dest = *(char*)src;
            dest = (char*)dest + 1;
            src = (char*)src + 1;
            num--;
        }
        return ret;
    }
    
    
    int main()
    {
        int a[] = {1,2,3,4,5,6,7,8,9,10};
        int a1[10] = {0};
        my_memcpy(a1,a+3,20);
        for (int i=0;i<10;i++)
        {
            printf("%d ",a1[i]);
        }
        return 0;
    }
    

    memmove函数

    函数的声明:

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

    memmove函数使用:

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

    函数的模拟实现:

    void* my_mommove(void*dest,const void*src,size_t num)
    {
        assert(dest&&src);
        void* ret = dest;
        if (dest < src)//判断dest与src的位置关系
        {
            while (num)
            {
                *(char*)dest = *(char*)src;
                dest = (char*)dest + 1;
                src = (char*)src + 1;
                num--;
            }
        }
        else
        {
            src = (char*)src + num - 1;
            dest = (char*)dest+num - 1;
            while (num--)
            {
                *(char*)dest = *(char*)src;
                dest = (char*)dest - 1;
                src = (char*)src - 1;
            }
        }
        return ret;
    }
    
    int main()
    {
        int a[] = {1,2,3,4,5,6,7,8,9,10};
        my_mommove(a+3,a,20);
        for (int i=0;i<10;i++)
        {
            printf("%d ",a[i]);
        }
        return 0;
    }
    

    memcpy函数与memmove函数的区别:
    memcpy函数在复制重叠的内存空间时,最后的结果是未知的,所以当源空间与目标空间重叠时,不用memcpy
    memmove函数可以正确的复制重叠空间

    在模拟memmove函数时,需要注意:

    • dest指针大于还是小于src指针
    • 如果是大于,在复制时从前往
    • 如果是小于,在复制时从后往前

    memset函数

    函数的声明:

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

    memset 函数是将ptr指针指向的空间下num个字节的值赋值为value

    函数的使用:

    int main()
    {
        char a[] = {"hello world"};
        memset(a,'x',6);
        printf("%s",a);
        return 0;
    }//前6个字符变成x
    

    memcmp函数:

    函数声明:

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

    比较两个指针指向的空间下num个字节的大小

    • 若ptr1大于ptr2,返回大于0的数

    • 小于返回小于0的数

    • 等于返回0

    memcmp函数的使用:

    int main()
    {
        int a[] = {1,2,3,4,5};
        int a1[] = {1,2,3,4,6};
        printf("%d", memcmp(a, a1, 20));
        return 0;
    }
    
  • 相关阅读:
    redis解决缓存与数据库双写一致性问题代码实现
    11.7加减计数器,可置位~,数字钟分秒,串转并,串累加转并,24位串并128,流水乘法器,一些乘法器
    机器学习即代码的时代已经到来
    专注效率提升「GitHub 热点速览 v.22.36」
    Taro React组件开发(1) —— Overlay 遮罩层【渐入渐出动画遮罩层】
    2022/7/4前端开发面经
    【中秋征文】使用Python中秋节程序员的浪漫《嫦娥奔月》
    FPGA之旅设计第五例-----IIC通信
    bp盐丘模型波场数值模拟matlab
    Vuex与前端表格施展“组合拳”,实现大屏展示应用的交互增强
  • 原文地址:https://blog.csdn.net/yzqy_/article/details/139391541
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号