模拟实现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过滤标签节点及属性
780 4
|
机器学习/深度学习 搜索推荐 算法
机器学习引领教育革命:智能教育的新时代
机器学习引领教育革命:智能教育的新时代
266 1
|
安全 物联网 网络安全
智能家居安全:从风险分析到防护措施的全面指南
随着物联网技术的飞速发展,智能家居系统已逐渐走入千家万户。然而,智能化带来的便捷背后隐藏着不容忽视的安全风险。本文深入探讨了智能家居系统中存在的各类安全威胁,并提出了一套综合性的安全防护措施。文章不仅涵盖了技术层面的解决方案,还强调了用户在提升家居安全中的关键作用。通过案例分析,本文旨在为读者提供一份实用的智能家居安全指南,确保技术便利与个人隐私的双重保障。
|
缓存 网络架构
计算机网络基础知识和术语(二)---性能指标
计算机网络基础知识和术语(二)---性能指标
1400 1
|
XML Java API
使用WebService接口进行数据通信
使用WebService接口进行数据通信
|
机器学习/深度学习 数据采集 人工智能
【机器学习】非线性回归与线性回归有何不同?
【5月更文挑战第19天】【机器学习】非线性回归与线性回归有何不同?
|
Java Maven
深入探索Maven:优雅构建Java项目的新方式(一)
深入探索Maven:优雅构建Java项目的新方式(一)
|
JSON JavaScript 前端开发
JsonPath使用和示例
JsonPath使用和示例
318 1
|
机器学习/深度学习 人工智能 运维
如何通过AI 全面提升运维效率?选型宝分享AIOps实战案例
前言 运维,是企业IT最基础的工作,也是痛点、槽点最多的工作。海量的数据、频繁的报警、艰难的排障、无情的投诉,足以让运维工程师们感到崩溃和绝望…… Gartner在ITOA (IT Operations Analytics IT运营分析)的基础上,提出了AIOps的概念。
3459 0
R|tableone 快速绘制文章“表一”-基线特征三线表
R|tableone 快速绘制文章“表一”-基线特征三线表
391 0