今日思想:懂事的人连崩溃都会选好时间!
一、memcpy使用和模拟实现
1、memcpy使用
void* memcpy(void*dset,const void* sore,size_t num)
上述函数的使用方法和解释:
①这个函数会把sore数组的前num个字节复制到dest数组的前num个字节上。
②memcpy函数在遇到'\0'之前不会停下来。
③如果dest和sore指向同一个数组,复制的结果未知(建议使用memmove函数)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[30] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[30] = { 0 };
memcpy(arr2,arr1,5*sizeof(int));
//printf("%s\n", arr2);
for (int i = 0; i < 30;i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
2、模拟实现
分析:根据memcpy函数的定义可知
void* memcpy(void*dset,const void* sore,size_t num)
因为sore和dest是void*类型,我们可以传任意类型的数据,但是我们不能解引用,使用我们要强制类型转换成char*,为什么强制转换成char*因为我们不论传什么类型的数据都可以通过char*来一个个访问;例如传的是int*的类型,如果访问的话在x64位就是8个字节在x32位就是4个字节来访问。
所以代码实现:
*(char*)dest = *(char*)sore;
dest = (char*)dest + 1;
sore = (char*)sore + 1;
最终代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void* my_memcpy(void* dest, const void* sore, size_t num)
{
void* set = dest;
for (int i = 0; i < num; i++)
{
*(char*)dest =*(char*)sore;
dest = (char*)dest + 1;
sore = (char*)sore + 1;
}
return set;
}
int main()
{
int arr1[30] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[30] = { 0 };
my_memcpy(arr2,arr1,5*sizeof(int));
//printf("%s\n", arr2);
for (int i = 0; i < 30;i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
二、memmove使用和模拟实现
1 void * memmove ( void * destination, const void * source, size_t num );
1、memmove的使用介绍
①dest和sore可以指向同一个数组。
②这个函数会把sore数组的前num个字节复制到dest数组的前num个字节上。
③memcpy函数在遇到'\0'之前不会停下来。
2、使用效果和memcpy函数一样。
3、模拟实现
分析跟memcpy函数一样,不过有一点不同:
当dest和sore指向同一个数组时:
分析如下:
①当dest>=sore 从前往后复制,如果从后往前复制的话会有部分内容被覆盖得不到想要的值
图解:
代码实现 :
if (sore <= dest)
{
dest = (char*)dest + num-1;
sore = (char*)sore + num-1;
while (num--)
{
*(char*)dest = *(char*)sore;
dest = (char*)dest - 1;
sore = (char*)sore - 1;
}
}
②当dest<sore 从后往前复制。
图解:
代码实现:
else
{
for (int i = 0; i < num; i++)
{
*(char*)dest = *(char*)sore;
dest = (char*)dest + 1;
sore = (char*)sore + 1;
}
}
完整的代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void* my_memcpy(void* dest, const void* sore, size_t num)
{
void* set = dest;
if (sore <= dest)
{
dest = (char*)dest + num-1;
sore = (char*)sore + num-1;
while (num--)
{
*(char*)dest = *(char*)sore;
dest = (char*)dest - 1;
sore = (char*)sore - 1;
}
}
else
{
for (int i = 0; i < num; i++)
{
*(char*)dest = *(char*)sore;
dest = (char*)dest + 1;
sore = (char*)sore + 1;
}
}
return set;
}
int main()
{
int arr1[30] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[30] = { 0 };
my_memcpy(arr2,arr1,5*sizeof(int));
//printf("%s\n", arr2);
for (int i = 0; i < 30;i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
标签:sore,dest,void,memmove,char,程序员,int,memcpy
From: https://blog.csdn.net/2403_84958571/article/details/144013346