请教高手如何通过memcpy对vector bytes 赋值?

热爱生活 2011-08-18 10:19:32
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
#include <stdlib.h>
#include <vector>
using std::vector;

struct M
{
char tower[100]; // tower id
float windSpeed; // knots
short windDirection; // degrees
float temperature; // degrees Celsius
};
int
main(int argc, char* argv[])
{
M m;
strcpy_s<100>(m.tower,"sdadasd");
m.windSpeed=1.22;
m.windDirection=2;
m.temperature=2.45;
byte buff[100];
memcpy(buff,&m,sizeof(m)); //把m的内容以字节形式拷贝到buff中
vector<byte> bytes;//定义bytes 表示一组字节
bytes buf;//定义buf为一组字节格式
memcpy(buf,buff,sizeof(m));//我想把buff的内容付给buf结果报错:
// error C2664: “memcpy”: 不能将参数 1 从“std::vector<_Ty>”转换为“void *”
}
不知道怎么回事,该怎么修改呢?请高手指教一下!
...全文
757 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
热爱生活 2011-08-18
  • 打赏
  • 举报
回复
运行到程序结尾后,在反汇编里面继续跟踪:
00401201 mov dword ptr [ebp-4],0FFFFFFFFh
00401208 lea ecx,[ebp-10Ch]
0040120E call std::vector<unsigned char,std::allocator<unsigned char> >::~vector<unsigned char,std::allocator<unsigned char> > (401340h)
00401213 xor eax,eax
00401215 push edx
00401216 mov ecx,ebp
00401218 push eax
00401219 lea edx,[ (401250h)]
0040121F call _RTC_CheckStackVars (404AD0h) //运行到这里出现提醒:Run-Time Check Failure #2 - Stack around the variable 'buff' was corrupted.
热爱生活 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhao4zhong1 的回复:]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,……
[/Quote]

谢谢您!
赵4老师 2011-08-18
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
热爱生活 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 downmooner 的回复:]
还是循环把byte[0] 到 bytes[sizeof(M)-1]的copy到一个buff里,然后强制转换buff
[/Quote]

谢谢!循环果然很强大!
byte Buff[100];
for(int i = 0; i != sizeof(m); ++i)
{
Buff[i]=bytes[i];
}
//strcpy(buf,buff);
M* mm;
mm=(M*)Buff;
cout<<mm->temperature<<endl;
cout<<mm->tower<<endl;
cout<<mm->windDirection<<endl;
cout<<mm->windSpeed<<endl;
运行跟踪后,发现数据传过去了!
mm得到了结构体的内容了!
可是还是报错,好像很严重,对话框内容为:

Run-Time Check Failure #2 - Stack around the variable 'Buff' was corrupted.
中断 继续
downmooner 2011-08-18
  • 打赏
  • 举报
回复
还是循环把byte[0] 到 bytes[sizeof(M)-1]的copy到一个buff里,然后强制转换buff
热爱生活 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 demon__hunter 的回复:]
C/C++ code


vector<byte> bytes(sizeof(m));//定义bytes 表示一组字节
//定义buf为一组字节格式
memcpy((byte*)(*bytes.begin()),buff,sizeof(m));//我想把buff的内容付给buf结果报错:
[/Quote]
测试没有通过。

可是我还想把byte内容以M的格式取出来,怎么办呢?
我这样做的:
M* mm;
mm=(M*)bytes;//error C2440: “类型转换”: 无法从“std::vector<_Ty>”转换为“M *”
cout<<mm->temperature<<endl;
cout<<mm->tower<<endl;
cout<<mm->windDirection<<endl;
cout<<mm->windSpeed<<endl;
我该怎么做呢?请指教一下!十分感谢
热爱生活 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhao4zhong1 的回复:]
typedef vector<byte> bytes;//定义bytes 表示一组字节
bytes buf=vector(buff,buff+sizeof(m));//error C2955: “std::vector”: 使用类 模板 需要
//板 参数列表
试试看。
[/Quote]
报错:
error C2955: “std::vector”: 使用类 模板 需要 模板 参数列表
热爱生活 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhao4zhong1 的回复:]
typedef vector<byte> bytes;//定义bytes 表示一组字节
bytes buf=vector(buff,buff+sizeof(m));
试试看。
[/Quote]

好的,谢谢您!我试试!
机智的呆呆 2011-08-18
  • 打赏
  • 举报
回复

vector<byte> bytes(sizeof(m));//定义bytes 表示一组字节
//定义buf为一组字节格式
memcpy((byte*)(*bytes.begin()),buff,sizeof(m));//我想把buff的内容付给buf结果报错:
热爱生活 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 downmooner 的回复:]
for(int i = 0; i != sizeof(m); ++i)
{
bytes.push_back(buff[i]);
}
[/Quote]
谢谢楼上,测试通过了!
可是我还想把byte内容以M的格式取出来,怎么办呢?
我这样做的:
M* mm;
mm=(M*)bytes;//error C2440: “类型转换”: 无法从“std::vector<_Ty>”转换为“M *”
cout<<mm->temperature<<endl;
cout<<mm->tower<<endl;
cout<<mm->windDirection<<endl;
cout<<mm->windSpeed<<endl;
我该怎么做呢?请指教一下!十分感谢!
赵4老师 2011-08-18
  • 打赏
  • 举报
回复
typedef vector<byte> bytes;//定义bytes 表示一组字节
bytes buf=vector(buff,buff+sizeof(m));
试试看。
downmooner 2011-08-18
  • 打赏
  • 举报
回复
for(int i = 0; i != sizeof(m); ++i)
{
bytes.push_back(buff[i]);
}

65,209

社区成员

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

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