memcpy 是内存拷贝函数
- 拷贝字符串
- 拷贝整型数组
- 拷贝结构体数据
void * memcpy ( void * destination, const void * source, size_t num );
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
- 这个函数在遇到 '\0' 的时候并不会停下来。
- 如果source和destination有任何的重叠,复制的结果都是未定义的。
简单使用一下
#include <stdio.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
//将arr1中的内容,拷贝到arr2中
memcpy(arr2, arr1, 40);
int i = 0;
for (i = 0; i < 20; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
运行图

接着我们模拟实现memcpy
#include <stdio.h>
void* my_memcpy(void* dest, const void* sor, size_t num)
{
while (num--)
{
*(char*) dest = *(char*) sor;
dest = (char*)dest +1;
sor = (char*)sor +1;
}
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9 };
int arr2[20] = { 0 };
my_memcpy(arr2, arr1,20);
int i = 0;
for (i = 0; i < 20; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
因为size_t num为20个字节,所以只拷贝到5

memmove
前面说过,如果source和destination有任何的重叠,复制的结果都是未定义的
而memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
所以如果源空间和目标空间出现重叠,就得使用memmove函数处理。
void * memmove ( void * destination, const void * source, size_t num );
memmove使用与memcpy差不多
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1 + 2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
运行图

模拟实现
#include <stdio.h>
void* my_memove(void* dest, void* sor, size_t num)
{
if (dest < sor)
{
while (num--)
{
*(char*)dest = *(char*)sor;
dest = (char*)dest + 1;
sor = (char*)sor + 1;
}
}
else
{
while(num--)
{
*((char*)dest + num) = *((char*)sor + num);
}
}
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memove(arr1+2, arr1,20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
结果与刚刚的一样

文章详细介绍了C语言中的memcpy函数,用于无重叠区域的内存拷贝,以及其基本使用和模拟实现。同时,对比了memmove函数,它能处理源和目标内存区域的重叠情况,也给出了memmove的使用和模拟实现例子。
973

被折叠的 条评论
为什么被折叠?



