模拟实现memcpy,memmove,memset,memcmp

简介: memcpyvoid * memcpy ( void * destination, const void * source, size_t num );

memcpy

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

使用注意事项:


从source的位置向后复制num个字节数据到destination所指向的内存位置中。


这个函数遇到如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

\0并不会停下。


当source和destination有一定的重叠,复制的结果都是未定义的。

void* memcpy(void* dst, const void* src, size_t count)
{
  void* ret = dst;//用一个指针指向dst
  assert(dst);
  assert(src);
  while (count--) {//将src的前count位赋值给dst
    *(char*)dst = *(char*)src;//将src的一个字节赋值给dst
    dst = (char*)dst + 1;
    src = (char*)src + 1;
  }
  return(ret);
}

memmove

memmove和memcpy函数的区别就是源内存块和目标内存块是可以重叠的。

如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

memove的模拟实现

 
void* memmove(void* dst, const void* src, size_t count)
{
  void* ret = dst;
  if (dst <= src || (char*)dst >= ((char*)src + count)) {
    while (count--) {
      *(char*)dst = *(char*)src;
      dst = (char*)dst + 1;
      src = (char*)src + 1;
    }
  }
  else {
    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

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

memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。

#include <stdio.h>
#include <string.h>
int main ()
{
    char str[] = "hello world";
    memset (str,'x',6);
    printf(str);
    return 0;
}

输出结果为:xxxxxxworld

memcmp

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

⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节

相关文章
|
存储 JavaScript 前端开发
前端xss攻击——规避innerHtml过滤标签节点及属性
前端xss攻击——规避innerHtml过滤标签节点及属性
880 4
|
XML Java API
使用WebService接口进行数据通信
使用WebService接口进行数据通信
|
存储 文字识别 算法
印刷文字识别使用问题之电商图片文字识别是否支持一次调用识别多张图片
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
存储 缓存 NoSQL
高并发项目部署以及优化手段
高并发项目部署以及优化手段
1298 0
R|tableone 快速绘制文章“表一”-基线特征三线表
R|tableone 快速绘制文章“表一”-基线特征三线表
468 0
|
机器学习/深度学习 传感器 人工智能
【路径规划】基于Dubins实现多机器人任务分配和路径规划-速度约束与负载均衡附matlab代码
【路径规划】基于Dubins实现多机器人任务分配和路径规划-速度约束与负载均衡附matlab代码
如何打出特殊字符
如何打出特殊字符
175 0
|
SQL 关系型数据库 MySQL
28个案例问题分析---02---sql优化--mysql执行顺序、explain关键字解析
28个案例问题分析---02---sql优化--mysql执行顺序、explain关键字解析
362 0
|
弹性计算 Cloud Native 算法
RDS on 倚天释放技术红利
2023年5月7日,阿里云瑶池数据库RDS MySQL和RDS PostgreSQL倚天ARM架构全系列目录价下调,最高降幅40%。产品商业策略调整的背后,是持续的软硬件协同技术优化带来的红利释放。
|
前端开发 数据安全/隐私保护 Python
Python验证码
验证码通常是为了区分用户是人还是计算机,也可以防止破解密码、刷票等恶意行为,而客户端上多数会用在关键操作上,比如购买、登录、注册等场景。现在验证码的种类样式也特别多,今天教大家如何用Python做出滑动拼图验证码吧~
Python验证码