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;
}

相关推荐
Pniubi8 分钟前
区分agent中长期记忆和偏好记忆
开发语言·ai·智能体
BeiGuTing_code19 分钟前
C链表基础(二)有视频模拟!!!
c语言·链表·音视频
我就是不信26 分钟前
Swift 方法派发机制详解
开发语言·ios·swift
CCCCCCCCharlie29 分钟前
深入解析I/O底层:文件描述符与缓冲区真相
linux·开发语言·c++·算法
Zenova EdgeOS37 分钟前
Rust TUI 实战:用 ratatui 构建工业边缘终端界面
开发语言·后端·rust·工业网关
学逆向的1 小时前
C 选择结构的执行效率分析
c语言·开发语言·算法·网络安全
geats人山人海1 小时前
java 8 字符串
java·开发语言
云和数据.ChenGuang1 小时前
Golang AI 工程师路线图:从入门到实战
开发语言·人工智能·后端·golang
wuminyu2 小时前
Continuation::freeze与thaw的x86_64汇编Stack Chunk拆解源码分析
java·linux·c语言·汇编·jvm·c++
事圆则缓2 小时前
Kotlin学习导航:从知识树走到项目与面试
android·开发语言·kotlin