memcpy函数的使用和模拟实现

749472af25b84cb88f2533305a458519.png

目录

1.头文件

 2.memcpy函数讲解

解释:

3.memcpy自己复制自己 

4.memcpy函数模拟实现


方源一把抓住VS2022,催动春秋产的气息,顷刻炼化


1.头文件

memcpy函数的使用需要包括头文件

#include<string.h>

 2.memcpy函数讲解

18b101a354ac48479323621751863ca6.png

我们之前学习过strcpy函数,strcpy函数是一种专门用来字符串复制的函数

而memcpy函数是类似的,只是memcpy函数可以复制一切类型的内容

解释:

1. memcpy函数接受三个参数,前两个参数为void*类型的地址,最后一个参数为字节个数

2. memcpy函数将从source的位置开始复制num个字节的数据到destination的内存位置

3. memcpy函数在复制时遇到'\0'不会停下,可以将'\0'复制上去

 4. 如果source与destination有任何的重叠,复制的结果未定义(自己复制自己)

示例如下:

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>
int main()
{	
	 char arr[] = { "12345"};
	 char arr1[] = { "abcxxxdefg" };
	memcpy(arr1, arr, 5);
	//从arr所指向的地址开始,复制5个字节的内容,粘贴到arr1的地址内存上去
	//arr1应该为12345xdefg
	int sz = strlen(arr1);
	for (int i = 0; i < sz; i++) {
		printf("%c ", arr1[i]);
		//打印出1 2 3 4 5 x d e f g
	}

}

接下来是测试'\0'会不会复制上去

示例如下:

cad718acc13c49dc8574f6cbec49866f.png

我们发现,最后一个x消失了,其实是被'\0'取代了,所以会将'\0'复制上去,如果我们想进一步验测,可以使用strlen函数,代码如下:

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>
int main()
{	
	 char arr[] = { "12345"};
	 char arr1[] = { "abcxxxdefg" };
	 int sz = strlen(arr1);
	memcpy(arr1, arr, 6);
	//从arr所指向的地址开始,复制6个字节的内容,将'\0'复制上去,粘贴到arr1的地址内存上去
	//arr1应该为12345 defg
	
	for (int i = 0; i < sz; i++) {
		printf("%c ", arr1[i]);
	
	}
	printf("%zd ", strlen(arr1));
	//arr1此时是{"12345\0defg\0"
	//strlen函数遇到'\0'会停止计数,所以应该打印5
	//打印正确:为5

}

3.memcpy自己复制自己 

示例如下:

18d4af5ea69d4df79d304c8d59e10951.png

需要注意的是:memcpy通常不可用于自己复制自己也就是重叠地址的复制,但是VS2022是可以的


4.memcpy函数模拟实现

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>
void my_memcpy(void* arr1,void* arr2,size_t num) {
	while (num--) {
		*(char*)arr1 = *(char*)arr2;
		//void*类型不可直接转换
		arr1 = (char*)arr1 + 1;
		arr2 = (char*)arr2 + 1;
	}
}
int main()
{	
	 char arr2[] = { "12345"};
	 char arr1[] = { "abcxxxdefg" };
	 int sz = strlen(arr1);
	 my_memcpy(arr1, arr2, 5);
	 //memcpy主要是实现字节的复制,如果想复制整型的话,一次是4个字节,如果是字符型一次是1个字节,memcpy函数可以实现任意类型的复制
	 //所以最好的办法就是一个字节一个字节的复制
	 for (int i = 0; i < sz; i++) {
		 printf("%c ", arr1[i]);
	 }
}

注意:我们模拟的memcpy函数不可以实现地址重叠的复制,如果想实现地址重叠的复制,我们最好使用memmove函数,下一节有讲 


c9f52a6612524e61924e17fbd310732d.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值