C语言内存函数memcpy与memmove

一.memcpy的使用和模拟实现

1.函数原型

复制代码
void* memcpy(void* destination, const void* source, size_t num);

destination是目标内存块的指针

source是源内存块的指针

num是要复制的字节数
.函数memcpy从source的位置开始向后复制 num个字节 的数据到destination指向的内存位置。
.这个函数在遇到 '\0' 的时候并不会停下来。
.如果source和destination有任何的重叠,复制的结果都是未定义的。

PS:memcpy函数只关心内存块的二进制表示,不关心其所代表的数据类型,因此可能会出现类型转换问题。此外,在使用memcpy函数时需要确保目标内存块有足够的空间来存储源内存块中的数据,否则会导致内存越界错误。

2.代码使用

复制代码
#include <stdio.h>
#include <string.h>
int main()
{
     int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
     int arr2[10] = { 0 };
     memcpy(arr2, arr1, 20);
     //注意是20个字节
     int i = 0;
     for (i = 0; i < 10; i++)
     {
         printf("%d ", arr2[i]);
     }
     return 0;
}

3.memcpy的模拟实现

复制代码
#include<stdio.h>
void *my_memcpy(void *p1,const void *p2,int n)
{
	int i=0;
	for(i=0;i<n;i++){
		*(char*)p1=*(char*)p2;
		p1++;
		p2++;
	}
}
int main()
{
	int arr1[20]={1,2,3,4,5,6,7,8,9,10};
	int arr2[5]={1,2,3,4,5};
	my_memcpy(arr1+3,arr2,5*sizeof(int));
	int i=0;
	for(;i<20;i++){
		printf("%d ",arr1[i]);
	}
	
	return 0;
}

二.memmove的使用与模拟实现

1.函数原型

复制代码
void * memmove ( void * destination, const void * source, size_t num );

memmove函数会将src指针指向的内存区域中的前num个字节复制到dest指针指向的内存区域中。

PS:与memcpy函数相比,memmove函数更加灵活,因为它能够处理源地址与目的地址重叠的情况。但是,由于memmove函数需要进行更多的判断和处理,所以在一些情况下,memcpy函数可能更加高效。

2.代码使用

复制代码
#include <stdio.h>
#include <string.h>
int main()
{
  int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
  memmove(arr1+2, arr1, 20);
  int i = 0;
  for (i = 0; i < 10; i++)
  {
   printf("%d ", arr2[i]);
  }

  return 0;
}

3.memmove的代码模拟实现

复制代码
#include<stdio.h>
void *my_memmove(void *p1,const void *p2,int n)
{
	int i=0;
	if(p1<p2){
		for(i=0;i<n;i++){
			*(char*)p1=*(char*)p2;
			p1++;
			p2++;
		}
	}
	else
	{
		while(n--)
			*((char*)p1+n)=*((char*)p2+n);
	}
}
int main()
{
	int arr[10]={1,2,3,4,5,6,7,8,9,10};
	my_memmove(arr+2,arr,4*sizeof(int));
	int i=0;
	for(;i<10;i++){
		printf("%d ",arr[i]);
	}
	
	return 0;
}

相关推荐
LDR00611 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术11 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园11 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob11 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享11 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.11 天前
C语言--day30
c语言·开发语言
玖玥拾11 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
何以解忧,唯有..11 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
謓泽11 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下11 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php