请教一个关于Memcpy的问题...

gotopsoft 2014-09-03 11:47:11
struct POINTAPI
{
long x;
long y;
};

void _stdcall MemcpyA(POINTAPI *lpdest[], POINTAPI lpsource[], int istart, int ilen)
{ // 复制从指定下标开始,大小为ilen的结构数组到lpdest
int pointapi_size;

// 结构大小
pointapi_size=sizeof(POINTAPI);
//目的,源(地址偏移),数据块大小
memcpy( &lpdest, &lpsource + pointapi_size*(istart - 1), ilen*pointapi_size);
}

刚学C++,惭愧。请问错在哪里呀?
...全文
486 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shwill123 2018-08-29
  • 打赏
  • 举报
回复
memcpy( &lpdest, &lpsource + (istart - 1), ilen*sizeof(POINTAPI));
改成
memcpy( lpdest, lpsource + (istart - 1), ilen*sizeof(POINTAPI));
lpdest 本来就是个地址 不需要再取地址了
脑洞蛇 2018-08-18
  • 打赏
  • 举报
回复
memcpy( &lpdest, &lpsource + pointapi_size*(istart - 1), ilen*pointapi_size);
这里 &lpsource + pointapi_size*(istart - 1) ,pointapi_size去掉。指针+1,地址偏移量是一个整个结构体的地址偏移,不需要再乘pointapi_size了,如果下标起始值是0,直接加下标;起始值是1就-1。
/* @brief:复制从指定下标开始,大小为ilen的结构数组到lpdest
*@param:dest 目标地址
*@param:src 数据源
*@param:startNum 起始下标
*@param:num
void _stdcall MemcpyA(POINTAPI *lpdest[], POINTAPI lpsource[], int istart, int ilen)
{
//目的,源(地址偏移),数据块大小
memcpy( &lpdest, &lpsource + (istart - 1), ilen*sizeof(POINTAPI));
}
勤奋的小游侠 2014-09-04
  • 打赏
  • 举报
回复
(POINTAPI *lpdest[], POINTAPI lpsource[], int istart, int ilen) 你这个参数是一个二维的数组,让编译器很混乱。
wanght99 2014-09-04
  • 打赏
  • 举报
回复
memcpy( &lpdest, 这里, lpdest是函数的参数, 是一个局部变量, 你对它取地址是局部变量的地址, 肯定不是你想复制到的地方. 另外你的lpdest是指针的指针 POINTAPI **, lpsource 是指针, 用的时候要注意.
再次简化代码,取消串口,直接显示结果,仍然有问题!!

疑问代码如下:
struct _USB_DATA_STRUCT
{
/*
unsigned char command_data[40];//release结果正确
int command_index;
int command_size;
int numofnod;
*/
int command_index;
int command_size;
int numofnod;
unsigned char command_data[40];//release结果错误

void SetData(unsigned char* pdata,int size)
{
if(size>40)
{
AfxMessageBox("数据太大,超范围!");
return;
}
memcpy(command_data,pdata,size);
}
};

void CTestprjDlg::OnButton1()
{
// TODO: Add your control notification handler code here
unsigned char ctem[32];//错误:32,103,104; 正确:105,110

USB_DATA_STRUCT CommandData;//需要填写要发送的数据

ctem[0]=0xee;
ctem[1]=0x01;
memset(ctem+2,0x00,30);

CommandData.SetData(ctem,32);

ShowTest(CommandData.command_data,32);
}

void CTestprjDlg::ShowTest(unsigned char* p,int nlen)
{
CString str = _T("");
for(int i=0;i <32;i++)
{
CString tmp_str;
tmp_str.Format("0x%02X ", p[i]);
str += tmp_str;
}
m_textctrl.SetWindowText(str);
}

//VC6

Debug版本没有问题,输出如:
EE 01 00 00 00...后面全0
Release版本(按Maximize speed优化)有问题,输出如:
EE 01 00 00 00 00 00 00 00 00 00 00 EE 01 00 00 00 00 00 00 00 00 00 00 EE 01 00 00 00 00 00 00

Release版本下,按以下修改没有问题
1.调整ctem的大小。小于等于104有问题,大于等于105没有问题
2.将ctem改为char* ctem;
ctem=new char[32];
没有问题

3.优化方式由Maximize speed修改为Minimize code也没问题

请教可能是什么原因?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧