使用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

你可能感兴趣的:(C++)