使用memcpy踩出来的坑,值得注意

背景描述:

最近在一个qt项目中,数据传输部分多次使用了memcpy,程序编译没有一个警告或报错,但是一运行起来就不稳定了,有时甚至不能运行起来,有时跑起来能传输几条数据,有时又能接收到几十条数据,但最终程序都会异常crashed!!甚是恼火!排除问题找了半天,野指针,数组越界,内存泄露都认真检查了几遍,实在没有找到问题出在哪,最后只能采用最笨的办法,把代码分模块注释掉,逐步锁定问题范围,最后才发现数据拷贝这一块有问题,然后又重新学习了一遍memcpy,才发现问题所在!!一不注意就会出错的地方,真的太难了!!!

下面在一起学习以下memcpy()
memcpy指的是C和C++使用的内存拷贝函数,函数原型为:

void *memcpy(void *destin, void *source, unsigned n)
函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。
问题来了,注意我标注了的地方,拷贝的是字节数,不是个数!这句话什么意思了,下面用代码说明
    int a[10] = {0,1,2,3,4,5,6,7,8,9};
    memcpy(a, a + 3, 2);

你以为这个结果是这样的吗?
3,4,2,3,4,5,6,7,8,9

那就犯了和我一样的错误了,找半天还不知道错在哪! 再强调一遍,拷贝的是字节数,不是个数
那么来分析正确结果应该是什么?

问题解决

1个int 类型占4个字节,上面的拷贝只拷贝了两个字节,怎么可能得到你想要的结果呢?正确写法应该是这样的:

memcpy(a, a + 3, 2*sizeof(int));

这样结果就是:
3,4,2,3,4,5,6,7,8,9
这才是理想中的答案!

参考:https://blog.csdn.net/baidu_35679960/article/details/80953973

  • 46
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值