目录
方源一把抓住VS2022,催动春秋产的气息,顷刻炼化
1.头文件
memcpy函数的使用需要包括头文件
#include<string.h>
2.memcpy函数讲解
我们之前学习过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'会不会复制上去
示例如下:
我们发现,最后一个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自己复制自己
示例如下:
需要注意的是: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函数,下一节有讲