您的位置:制图网首页 -> 新闻动态 -> memcpy函数【memcpy函数用法】

热门排行

memcpy函数【memcpy函数用法】

2023/1/30 来自于:制图网 点击:184

一、memcpy相关用法

C++ memcpy函数的用法比较简单,memcpy拷贝数据的时候,只需要传递拷贝数据的指针(4个字节)以及需要拷贝数据的大小就可以了。但是如何进行大数据的拷贝呢?以及如何拷贝若干份相同的数据(例如1000张图像)呢?

首先memcpy的原型如下:

void* memcpy(void* _Dst,const void* _Src,size_t _Size);

参数详解:

_Dst:新缓冲区。

_Src:复制的缓冲区。

_Size:要复制的字节数。

因为参数是void*类型,所以可以将其他任意的类型转换为void*类型,但是拷贝的大小会受到_Size的控制。

假设我们有1000张100*100的灰度图像,那么我们如何将这些数据拷贝到指定的目标中呢?具体如下

1、将若干份图像数据拷贝到指定目标中

// 申请需要开辟的目标缓冲区的大小 const int ImageSize = 100 * 100; const int ImageNums = 1000; char* pData = new char[ImageNums * ImageSize ]; // 1000张100*100的灰度图像 int index = 0; for(int i = 0; i < ImageNums ; i++) { // 假设图像的数据从文件中读取 CString strImagePath; strImagePath.Format("imageData%d",i); Mat src = imread(strImagePath,0); // 灰度图像加载 大小为100*100 // 将图像数据拷贝到指定的缓冲区中 memcpy(pData + index,src.data,ImageSize); index += ImageSize; } // 处理完之后,对pData做相应的处理之后,释放所开辟的空间 delete[] pData; pData = NULL;

2、将指定目标中的数据读取出来,拆分为一张张图像(1中是将所有的图像存到指定的缓存中,那么我们如何从缓存中取出每一张图像呢)

// 申请需要开辟的目标缓冲区的大小 const int ImageSize = 100 * 100; const int ImageNums = 1000; char* pData = new char[ImageNums * ImageSize ]; // 1000张100*100的灰度图像 int index = 0; for(int i = 0; i < ImageNums ; i++) { // 假设图像的数据从文件中读取 CString strImagePath; strImagePath.Format("imageData%d",i); Mat src = imread(strImagePath,0); // 灰度图像加载 大小为100*100 // 将图像数据拷贝到指定的缓冲区中 memcpy(pData + index,src.data,ImageSize); index += ImageSize; } //////////////////////////////////////////////////////////////// // 上述将1000张图像存入指定的缓存中,那么我们如何将图像取出来呢 index = 0; for(int i = 0; i < ImageNums ; i++) { Mat dst(100,100,CV_8UC1); // 创建图像 memcpy(dst.data,pData + index,ImageSize); index += ImageSize; // 已经将图像数据拷贝到指定图像中了 // 接下来对图像做相关的处理 } // 释放指针 delete[] pData; pData = NULL;

其实图像数据也可以替换成其他任意类型的数据,如结构体等。

二、我所踩过的一些坑

假设我现在需要传递两个float的数据,但是我们函数上面是中char*指针传递的,代码如下

但是最终的结果不正确,它的结果是0,那么原因在哪里呢?

虽然我们传递参数的时候将float类型的指针转换为char*类型的指针,但是一个float占四个字节,而一个char占一个字节,所以问题就处在char* data这里,data[0]占一个字节,data[1]占一个字节,而传过来的是两个float,即八个字节,但是我们只使用了八个字节的前两位,即data[0],data[1]。

那么我们该如何修改呢?

fdata[0] = data[0]; // 将data[0]赋值给第一个float fdata[1] = data[1]; // 将data[1]赋值给第二个float 替换为 memcpy((char*)fdata,data,sizeof(float)*2);

使用memcpy进行拷贝操作,将8个字节全部拷贝进来就OK了。

制图网(www.makepic.net),专业的logo免费设计在线生成网站,全自动智能化logo设计,商标设计,logo在线生成!

欢迎使用制图网制作属于您公司自己的logo,不仅专业而且经济实惠,全方位满足您公司品牌化、视觉化的需求。

输入激活码

只需简单一步,使用微信扫码(或长按识别二维码)并在任一小程序首页根据提示获取激活码! chatGPT中文网页版,无需注册,快来体验全网最火爆的人工智能应用!
刻字印章刻章子定刻光敏盖章印订制(淘宝商家)

输入激活码

只需简单一步,使用微信扫码(或长按识别二维码)并在任一小程序首页根据提示获取激活码! chatGPT中文网页版,无需注册,快来体验全网最火爆的人工智能应用!
刻字印章刻章子定刻光敏盖章印订制(淘宝商家)
请使用手机淘宝进行扫码