当前位置: 首页 > article >正文

C语言内存函数讲解

(一)memcpy函数

这是memcpy函数的说明。它的头文件是string.h。函数原型是

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

第一个参数是一个指向一个字符串的指针,第二个也是一样的。而第三个参数是复制的字节个数。这个函数的作用是将第二个字符串中首字节之后的num个字节复制到第一个字符串中去。这个函数遇到'\0'并不会停下来。而且这个函数不能处理同一个字符串复制的地方重叠的情况。下面是memcpy的模拟实现

void * memcpy ( void * dst, const void * src, size_t count)
{
    void * ret = dst;
    assert(dst);
    assert(src);
    /*
    * copy from lower addresses to higher addresses
    */
      while (count--) {
    *(char *)dst = *(char *)src;
    dst = (char *)dst + 1;
    src = (char *)src + 1;
    }
return(ret);
}

(二)memmove函数

memmove和memcpy的作用一样,但memmove比memcpy更具优势。memmove能处理重叠的部分,但memcpy不能处理重叠的部分下面是memmove的模拟实现

void * memmove ( void * dst, const void * src, size_t count)
{
    void * ret = dst;
    if (dst <= src || (char *)dst >= ((char *)src + count)) {
    /*
    * Non-Overlapping Buffers
    * copy from lower addresses to higher addresses
    */
    while (count--) {
    *(char *)dst = *(char *)src;
    dst = (char *)dst + 1;
    src = (char *)src + 1;
    }
    }
    else {
    /*
        * Overlapping Buffers
        * copy from higher addresses to lower addresses
        */
        dst = (char *)dst + count - 1;
        src = (char *)src + count - 1;
        while (count--) {
        *(char *)dst = *(char *)src;
        dst = (char *)dst - 1;
        src = (char *)src - 1;
        }
    }
    return(ret);
}

(三)memset函数

memset的作用是把目标字符串往后的num个字节中替换成函数参数的第二个值。memset的模拟实现的思路在之前的文章有,而且很简单,这里不再赘述

(四)memcmp

memcmp是比较两个内存中的值的函数。函数的原型是

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

和strcmp的思路一模一样,只是对比的单位是字节而不是字符串中的字符。


http://www.kler.cn/a/589314.html

相关文章:

  • 10-SDRAM控制器的设计—— signaltap 调试
  • iptables与firewall的区别,从不同的角度讲解
  • 基于金融产品深度学习推荐算法详解【附源码】
  • C++类:特殊的数据成员
  • 鸿蒙跳转到系统设置app界面
  • JAVA(8)-数组
  • 07.Python基础4
  • Linux中安装MySQL
  • 我又又又又又又又更新了~~~纯手工编写C++画图,有注释~~~
  • 解决git fetch 成功后还是不能checkout到fetch分支
  • 深入理解嵌入式开发中的三个重要工具:零长度数组、container_of 和 typeof
  • QT编程之JSON处理
  • AI软件栈:推理框架(二)-Llama CPP1
  • Qt 窗口以及菜单栏介绍
  • embedding技术
  • Cascadeur 技术浅析(五):碰撞避免算法
  • 【python web】一文掌握 Flask 的基础用法
  • 黑龙江有多线IDC服务器托管机房吗?
  • 输入:0.5元/百万tokens(缓存命中)或2元(未命中) 输出:8元/百万tokens
  • vulhub/log4j2漏洞靶场----反弹shell