内存拷贝---->memcpy
memcpy函数是内存拷贝函数,主要拷贝没有叠加的内存,将内存中的num个字节拷贝到另一快内存中。
void*memcpy(void*dest,constvoid*src,size_tcount);
dest目标内存空间,src源空间,count需要拷贝的字节数。
memcpy和strcpy的区别:memcpy可以拷贝任意类型的数据,strcpy只能拷贝字符串。memcpy遇到'\0不会停下来,strcpy遇到\0会停下来。
memcpy的使用:
int main()
{
int arr1[30] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
memcpy(arr2, arr1 + 2, 16);
for (int i = 0; i < 20; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
上述代码把前16个字节拷贝arr2数组里面去,memcpy的拷贝是一个字节一个字节拷贝的,如果拷贝14个字节,那么结果也是2,3,5,6。因为是小端存放,当拷贝12个字节后也就是3个整形,第4个整形也就是第13,14,15,16字节时,其计算机的存储是06,00,00,00。所以拷贝第13个字节的时候已经把数字6拷贝到数组arr2中去了。
memcpy的模拟实现:
void* my_memcpy(void* dest, const void* src, int count)
{
void* start = dest;
assert(dest && src);
while (count--)
{
*(char*)dest = *(char*)src;
(char*)dest = (char*)dest + 1;//void*的指针不能++和解引用,必须强制类型转换
(char*)src = (char*)src + 1;//char的指针能保证一个字节一个字节拷贝
}
return start;
}
int main()
{
int arr1[30] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
my_memcpy(arr2, arr1 + 2, 16);
for (int i = 0; i < 20; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
内存拷贝---->memmove
memcpy和么move的区别为memcpy拷贝的内存是不能重叠的,memmove拷贝的内存可以重叠。
例:
int main()
{
int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
memcpy(arr1, arr1 + 2, 20);
for (int i = 0; i < 20; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
我们发现中间出现了重叠,不是我们想要的结果,对于内存重叠的拷贝要用memmove
memmove的使用:
#include<string.h>
int main()
{
int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1, arr1 + 3, 20);
for (int i = 0; i < 20; i++)
{
printf("%d ", arr1[i]);
}
return 0;
memove的模拟实现:
思路:memove的模拟实现要分2种情况,从前拷贝和从后拷贝,没有重叠的从前拷贝和从后拷贝都可以。有重叠部分要看原地址和目标地址谁在前谁在后去做相应的分类讨论。
情况一:从前往后拷贝
当dest<src(目标地址在原地址之前,且有重叠)从前向后拷贝
情况二:从后向前拷贝
当dest>src,从后向前拷贝
模拟实现:
void* my_mve(void* dest,const void* src,int count)
{
void* start = dest;
assert(dest && src);
if (dest < src)
{
while (count--)
{
*(char*)dest = *(char*)src;
(char*)dest = (char*)dest + 1;
(char*)src = (char*)src + 1;
}
}
else
{
while (count--)
{
*((char*)dest + count) = *((char*)src + count);
}
}
return start;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
my_mve(arr1, arr1 + 2, 20);
return 0;
}
内存设置---->memset
以字节为单位来设置内存中的数据
例
int main()
{
char arr[] = "helloworld";
memset(arr, 'x', 4);
printf("%s", arr);
}