目录
memcpy
void*memcpy(void*str1,void*str2,int num);
这个函数的功能有点类似于strcpy本质上是字符串拷贝函数,这里使用的是void*而不是char*或者int*的目的就是为了可以拷贝各种类型的数据,我们只需要根据我们的需求进行类型转换即可。下面附上代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void* my_memcpy(void* str1, void* str2, int num)
{
char* p1 = (char*)str1;
char* p2 = (char*)str2;
char* ret = p1;
while (num--)
{
*p1 = *p2;
p1++;
p2++;
}
//char* ret = p1;
return ret;
}
int main()
{
char str[40] = { "abcdef"};
char arr[20] = { 0 };
int sz = strlen(str);
char* ret = my_memcpy(arr, str, sz);
printf("%s", ret);
return 0;
}
值得注意的点:
1第一行是为了跳过VS2022编译器的安全警告,比如有时候我们要把scanf写成scanf_s才可以使用,但是这样的话,代码的转移性降低在别的编译器就不能使用,所以我们使用该代码使得其跳过安全警告,这样就可以在VS中使用scanf
2我们先就写了char*ret=p1;
注意这里ret指向的其实是p1的地址,后面我们具体修改赋值p1的时候我们修改的是这块空间的内容,但是ret依然指向这块地址,所以我们可以在开头就直接定义ret
memmove
void*memmove(void*str,void*arr,int num);
这个函数的功能和Memcpy是一样的,但是这个函数的功能可以赋值相同的一块空间,比如str和arr都是一个数组ptr[10]的空间,这一点是memcpy做不到的也是如果出现了内存覆盖的时候我们必须要使用memmove
这里就出现了两种情况
1如果str的地址<arr的地址或者str的地址大于arr+num的地址,我们赋值的时候是从左向右赋值
2如果是其他的情况下,我们要从右向左赋值,这样做的目的是使得重复空间赋值可以得以实现,为了达到这个目的,我们就需要先让地址指向右边,也就是str+=num-1; arr+=num-1;然后再赋值