字符串和内存函数(下)

简介: 字符串和内存函数(下)

一、 memcpy

1. 定义

我们昨天介绍了字符串函数的拷贝 以及带有限制的字符串函数的拷贝

这个函数其实和我们带有限制的字符串函数的拷贝差不多

只不过这里传递进来的参数是void类型的 这样就能够接受所有类型的指针进来了

我们可以来尝试下这段代码

我们可以发现的是 这一段代码是可以完美运行的

2. 模拟实现

代码表示如下

void* my_memcpy(void* dest, const void* src, size_t num)
{
  assert(dest && src);
  void* ret = dest;
  while (num--)
  {
    *(char*)dest = *(char*)src;
    dest = (char*)dest + 1;
    src = (char*)src + 1;
  }
  return ret;
}
 
void test1()
{
  int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
  int arr2[10] = { 0 };
  //内存拷贝 memcpy
  //int*  int*
  my_memcpy(arr2, arr1 + 2, 17);
}

实现结果如下

我们发现 这样子是可以完美运行的

二、 memmove

1. 定义

其实memmove就是memcpy的升级版

我们可以发现 当我们想要移动数组本身的时候 其实memcpy并不能很好的执行

2. 实现

这是为什么呢 ?

我们画图来解释下

那么 代码表示如下

void* my_memmove(void* dest, const void* src, size_t num)
{
  assert(dest && src);
  void* ret = dest;
  if (dest < src)//前->后
  {
    while (num--)
    {
      *(char*)dest = *(char*)src;
      dest = (char*)dest + 1;
      src = (char*)src + 1;
    }
     }else
    while (num--)//后->前
    {
      *((char*)dest + num) = *((char*)src + num);
  }
}

我们可以发现 是可以完美运行的

三. memcmp

1. 定义

我们可以发现的是 这个和我们以前写的strncpy也差不了多少

我们来使用这个函数看看

我们可以发现 如果arr1大于arr2就返回1

如果arr1小于arr2就返回-1

如果arr1==arr2就返回0

2. 模拟实现

那么 我们来尝试模拟实现以下这个函数

代码表示如下

实现结果如下

四. memset

1.定义

memset可以将一个数组的前x个元素额设置成一个值

2. 实现

代码表示如下

int main()
{
  char arr[] = "hello world";
  memset(arr, 'x', 5);
  printf("%s\n", arr);
  memset(arr + 6, 'y', 5);
  printf("%s\n", arr);
  return 0;
}

实现效果如下

完美实现

以上便是本文所有内容,如有错误请各位大佬不吝赐教,感谢留言

目录
相关文章
|
6天前
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
11 2
|
7天前
|
C语言
字符串和内存函数(1)
字符串和内存函数(1)
23 7
|
3天前
|
C语言
【C语言】:4大内存函数
【C语言】:4大内存函数
8 2
|
7天前
字符串和内存函数(2)
字符串和内存函数(2)
21 5
|
13天前
|
安全 C语言
【C语言基础】:内存操作函数
【C语言基础】:内存操作函数
|
3天前
|
C语言
【C语言】:动态内存管理函数malloc,calloc,realloc和free的介绍的介绍
【C语言】:动态内存管理函数malloc,calloc,realloc和free的介绍的介绍
10 0
|
3天前
|
C语言
C语言内存函数
C语言内存函数
5 0
|
6天前
|
C语言 C++
C语言----C语言内存函数
C语言----C语言内存函数
|
11天前
|
消息中间件 存储 Kafka
实时计算 Flink版产品使用问题之 从Kafka读取数据,并与两个仅在任务启动时读取一次的维度表进行内连接(inner join)时,如果没有匹配到的数据会被直接丢弃还是会被存储在内存中
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3天前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
11 2

热门文章

最新文章