fread和memcpy的时候出现未处理的异常:0xC0000005:读取位置(msvcp100.dll)0xfeeefeee时发生访问冲突

a707000646 2012-03-07 02:58:15

struct GameInfo
{
int GameKind;
std::string GameName;
};
// 这是写进文件的代码
int gameType = iter->first;//这个和下面那一句都是没有问题的数据
GameInfo info = iter->second;
const int bufSize = sizeof(int) + sizeof(GameInfo);
char *p = new char[bufSize];
memcpy(p,&gameType,sizeof(int));
memcpy(p+sizeof(int),&info,sizeof(GameInfo));
fwrite(p,bufSize,1,fp);
//接下来是读取的代码
// 强制转换是不会出问题的,这段代码是没有错的
const int bufSize = sizeof(int) + sizeof(GameInfo);
char *p = new char[bufSize];
ZeroMemory(p,bufSize);
fread(p,bufSize,1,fp);
gameType = (int)*p;
gameinfo = *(GameInfo *)(p+sizeof(int));
//用了memcpy之后会出现标题中的问题
const int bufSize = sizeof(int) + sizeof(GameInfo);
char *p = new char[bufSize];
ZeroMemory(p,bufSize);
fread(p,bufSize,1,fp);
memcpy(&gameType,p,sizeof(int));
memcpy(&gameinfo,p+sizeof(int),sizeof(GameInfo));

//另外一种读取的方法

const int bufSize = sizeof(int) + sizeof(GameInfo);
fread(&gameType,sizeof(int),1,fp);//不知道这里为什么返回值不是sizeof(int)
fread(&gameinfo,sizeof(GameInfo),1,fp);//数据可以读入,调试的时候看出来数据时正确的,但是执行完之后就出错了while(feof(fp)==0)循环结束后,一样是标题上的错误

欢迎大家一起讨论吧,为什么会出现这样的错误
文件判断结束是一样的循环,上面读取的代码都是在循环内的,请大家帮帮忙吧,谢谢
...全文
671 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
a707000646 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pengzhixi 的回复:]

引用 3 楼 a707000646 的回复:
引用 1 楼 pengzhixi 的回复:

额 结构体里面有string这样的东东 就不要用gameinfo = *(GameInfo *)(p+sizeof(int));
这样的代码了。

能解释下为什么

1.你的这个对象的内存是new分配的,new做了2件事,1.分配内存 2.调用构造函数。你这里内存虽然分配了(这里面还实际到……
[/Quote]
有道理,不过这段代码是不会出错的,考虑的这个问题,我改用了char数组。
pengzhixi 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 a707000646 的回复:]
引用 1 楼 pengzhixi 的回复:

额 结构体里面有string这样的东东 就不要用gameinfo = *(GameInfo *)(p+sizeof(int));
这样的代码了。

能解释下为什么
[/Quote]
1.你的这个对象的内存是new分配的,new做了2件事,1.分配内存 2.调用构造函数。你这里内存虽然分配了(这里面还实际到对齐)。但是构造函数没调用。所以出问题很正常。
赵4老师 2012-03-07
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
a707000646 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]

额 结构体里面有string这样的东东 就不要用gameinfo = *(GameInfo *)(p+sizeof(int));
这样的代码了。
[/Quote]
能解释下为什么
bdmh 2012-03-07
  • 打赏
  • 举报
回复
string是不定长的
pengzhixi 2012-03-07
  • 打赏
  • 举报
回复
额 结构体里面有string这样的东东 就不要用gameinfo = *(GameInfo *)(p+sizeof(int));
这样的代码了。

64,642

社区成员

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

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