memcpy
拷贝内存块到目标空间
函数原型
void*memcpy(void*dest,constvoid*src,size_tcount);
参数讲解
参数 | 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库函数