【C库函数】memcpy函数详解

目录

memcpy

函数原型

参数讲解

返回值讲解

函数讲解(三个注意点)


memcpy

        拷贝内存块到目标空间

函数原型

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

参数讲解

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

返回值讲解

返回目标空间的起始地址 

函数讲解 

        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库函数

  • 53
    点赞
  • 183
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱躺平的威威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值