菜鸟笔记
提升您的技术认知

memcpy函数详解

目录

memcpy

函数原型

参数讲解

返回值讲解

函数讲解(三个注意点)

memcpy

        拷贝内存块到目标空间

函数原型

void *memcpy( void *dest, const void *src, size_t count ); 

参数讲解

参数 dest src count
解析 目标空间地址 要拷贝内容空间源地址 拷贝内容字节数

返回值讲解

返回目标空间的起始地址 

函数讲解 

        memcpy函数不像strncpy函数一样只能拷贝字符,memcpy函数可以拷贝任意类型的内容

具体使用如下

当使用时我们要注意三个点

1、 我们一定要注意memcpy第三个参数传的是要传内容的字节数

以上面为例,我们想把arr1中前五个元素传中arr2,在memcpy就要写20。为什么呢?因为arr1为整型数组,其中包含的元素也是整型,是4个字节。而我们要传递五个整型,所以就是4*5个字节

2、目的空间大小一定要能容纳memcpy所拷贝的内容

如果拷贝在内容超过目的空间大小,那么就会溢出 编译器会报出警告

3、尽量避免dest和src所指向的地址有内存重叠的部分 

例如:我们想把arr1中1、2、3分别拷贝到3、4、5的位置时,就出现了内存重叠的现象

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	memcpy(arr1 + 2, arr1, 12);

	return 0;
}

 上述代码意思是想像图1一样,把1、2、3分别拷贝到3、4、5的位置。但是现实情况确实图2那样,因为当第一个位置中的“1”拷贝到3的位置时,“3”这个数就被替换成1,当轮到第三个位置拷贝时,就会拷贝“1”而不是“3”。

这种就是内存重叠可能出现的情况,但是现在memcpy好像解决了重叠拷贝的问题,我在vs2019和ubuntu上测试的时候,memcpy竟然没有出错!

        也许是memcpy函数有了新的改进,但是大家平常还是应该注意在使用memcpy时避免内存重叠的情况。

在vs2019上运行截图

在 ubuntu上运行截图

 

我们在使用时也会有一些使用技巧

如下,当我们想把arr1中的3、4、5、6拷贝到arr2中去时,我们可以这样写

memcpy(arr2, arr1 + 2, 16);

到这memcpy函数就讲解完了,如果大家想模拟实现memcpy函数的话

可以参考这篇文章:模拟实现memcpy库函数