内存函数 memcpy,memmove ,memcmp

简介: memcpy表示内存函数,用法跟strcpy差不多, 都是作为拷贝函数存在strcpy只能用于字符串函数,而memcpy函数可以使用任意类型在使用任意类型时,肯定用到的参数是void void* memcpy(const void *dest,const void *src, size_t sum);这里的sum作为字节数传递

@TOC

一、memcpy函数

1.用法

memcpy表示内存函数,用法跟strcpy差不多, 都是作为拷贝函数存在

strcpy只能用于字符串函数,而memcpy函数可以使用任意类型

在使用任意类型时,肯定用到的参数是void

void* memcpy(const void *dest,const void *src, size_t sum);

这里的sum作为字节数传递

#include<stdio.h>
#include<string.h>
int main()
{
 int arr[10]={0};
 int arr2[10]={1,2,3,4,5,6,7,8,9,10};
 memcpy(arr1,arr2,20);//1 2 3 4 5   /20作为字节数 即传递4个整形
 return 0;
}

2.模拟实现memcpy函数

#include<stdio.h>
#incldue<assert.h>
void*mymemcpy(const void*dest,const void*src,size_t sum)//size_t说明作为无符号数存在
{
 assert(dest&&src);
 void*ret=dest;
  while(sum--)//void*的指针 无法解引用和自加自减,解引用不知道访问几个字节,自加自减不知道跳过结果字节  
  {
   *(char*)dest=*(char*)src;//这里不使用自加的原因: 因为强制类型转换是一种临时的状态 如果到++时,指针会变回void*  
   dest=(char*)dest+1;
   src=(char*)src+1;
  }
  return ret;
}
int main()
{
 int arr1[10]={0};
 int arr2[10]={1,2,3,4,5,6,7,8,9,10};
 mymemcpy(arr1,arr2,20);//传递4个整形
 return 0;
 }

二、memmove函数

1.用法

memmove函数是用于处理内存重叠的情况

参数同memcpy函数相同

voidmemmove(const void dest,const void*src,size_t sum);

#include<stdio.h>
#include<string.h>
int main()
{
 int arr[]={1,2,3,4,5,6,7,8,9,10};//将 1 2 3 4 5传给 3 4 5 6 7
 memmove(arr+2,arr,20);//结果为 1 2 1 2 3 4 5
 return 0;
}

2.模拟实现memmove函数

#include<stdio.h>
#include<assert.h>
void*mymemmove(const void*dest,const void*src,size_t sum)
{
 assert(dest&&src);
 void*ret=dest;//返回目的地的初始地址
  if(src>dest)//src大于dest指针时 从前往后传递
  {
  while(sum--)
   {
     *(char*)dest=*(char*)src;
     dest=(char*)dest+1;
     src=(char*)src+1;
   }
  }
  else//src小于dest指针时 从后往前传递
  {
  while(sum--)
   {
     *(char*)(dest+sum)=*(char*)(src+sum);
   }
  }
  return ret;
}
int main()
{
 int arr[]={1,2,3,4,5,6,7,8,9,10};
 mymemmove(arr+2,arr,20);//20代表字节数 即传递5个整形
 return 0;//1 2 1 2 3 4 5
}
  1. 当3 4 5 6 7 传递给 1 2 3 4 5时
    src>dest指针  从前往后传递
    在这里插入图片描述
  2. 当1 2 3 4 5传递给 3 4 5 6 7时
    src>dest指针 从后往前传递在这里插入图片描述

三、memcmp函数

1.用法

同strcmp函数用法差不多 都为比较函数

但strcmp只能比较字符串之间的大小

而 memcmp函数可以比较任意类型的大小

int memcmp(const void * s1,constvoid* s2,size_t sum);

#include<stdio.h>
#include<string.h>
int main()
{
 int arr1[]={1,2,3,4,5};
 int arr2[]={1,1,3,4,5};
 memcmp(arr1,arr2,8);//8为字节数 即2个整形
 return 0;
}

2.模拟实现memcmp函数

#include<stdio.h>
#include<assert.h>
int memcmp(const void*s1,const void*s2,size_t sum)
{
  assert(s1&&s2);
  char*pa=(char*)s1;
  char*pb=(char*)s2;
  while(sum--)
  {
   if(*pa==*pb)//两者有相同才向后移 没有就等sum减为0 输出 看是大于还是小于
   {
    pa++;//如果两者一直相同 不影响判断条件sum 出循环输出
    pb++;
   }
  }
  return *pa-*pb;
}
int main()
{
 int arr1[]={1,2,3,4,5};
 int arr2[]={1,1,3,4,5};
 int ret= memcmp(arr1,arr2,8);//8为字节数 即2个整形
 printf("%d\n",ret);//1
 return 0;
}
目录
相关文章
|
1月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
63 6
|
3月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
3月前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
43 0
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
356 1
|
29天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
2月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
2月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
25 3
|
2月前
|
存储 缓存 监控
Elasticsearch集群JVM调优堆外内存
Elasticsearch集群JVM调优堆外内存
55 1
|
2月前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
3月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
107 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS

热门文章

最新文章