积极答复者
这个程序中的指针错误在哪?

问题
-
#include <iostream> #include <string> using namespace std; struct system_message { int nId; std::string strTemp; }; int main() { int nId1 = 0; string strTemp1 = "wo"; int nId2 = 1; string strTemp2 = "women"; int nId3 = 2; string strTemp3 = "1233"; system_message systemmessage1; size_t size = 3*sizeof(system_message); unsigned char* byBuffer = new unsigned char[size]; systemmessage.nId = nId1; systemmessage.strTemp = strTemp1; memcpy(byBuffer,&systemmessage,sizeof(system_message)); system_message systemmessage2; systemmessage1.nId = nId2; systemmessage1.strTemp = strTemp2; size_t sizeMessage = sizeof(system_message); memcpy(byBuffer + sizeMessage,&systemmessage2,sizeMessage); system_message systemmessage3; systemmessage2.nId = nId3; systemmessage2.strTemp = strTemp3; memcpy(byBuffer + sizeMessage,&systemmessage3,sizeMessage); system_message* message = static_cast<system_message*>(static_cast<void*>(byBuffer)); for (int i = 0; i < 3; i++,message++) { cout << message->nId << endl; cout << message->strTemp << endl; } message = NULL; delete []byBuffer; byBuffer = NULL; system("pause"); return 0; }
如果只有两个的话,则这个程序运行是对的,但是当加第三个的时候,运行的时候就会提示 …….exe 中的 0x104f2445 (msvcp80d.dll)
处未处理的异常: 0xC0000005: 读取位置 0xcdcdcdcd 时发生访问冲突
不知道是什么原因。
等待解答。
答案
-
system_message systemmessage3;
systemmessage2.nId = nId3;
systemmessage2.strTemp = strTemp3;
memcpy(byBuffer + sizeMessage,&systemmessage3,sizeMessage);
memcpy(byBuffer + sizeMessage * 2, &systemmessage3, sizeMessage);
byBuffer 是缓冲区首地址, 前面已经放进去两个systemmessage了,当然第三个的首地址就是byBuffer + sizeMessage * 2了。
按照你的写法,你第三个systemmessage的数据把第二个systemmesage的数据覆盖了。当然缓冲区只有两个systemmessage项目了。
- 已标记为答案 飘零雪 2010年1月14日 13:17
全部回复
-
system_message systemmessage3;
systemmessage2.nId = nId3;
systemmessage2.strTemp = strTemp3;
memcpy(byBuffer + sizeMessage,&systemmessage3,sizeMessage);
memcpy(byBuffer + sizeMessage * 2, &systemmessage3, sizeMessage);
byBuffer 是缓冲区首地址, 前面已经放进去两个systemmessage了,当然第三个的首地址就是byBuffer + sizeMessage * 2了。
按照你的写法,你第三个systemmessage的数据把第二个systemmesage的数据覆盖了。当然缓冲区只有两个systemmessage项目了。
- 已标记为答案 飘零雪 2010年1月14日 13:17
-
system_message systemmessage3;
systemmessage2.nId = nId3;
systemmessage2.strTemp = strTemp3;
memcpy(byBuffer + sizeMessage,&systemmessage3,sizeMessage);
memcpy(byBuffer + sizeMessage * 2, &systemmessage3, sizeMessage);
byBuffer 是缓冲区首地址, 前面已经放进去两个systemmessage了,当然第三个的首地址就是byBuffer + sizeMessage * 2了。
按照你的写法,你第三个systemmessage的数据把第二个systemmesage的数据覆盖了。当然缓冲区只有两个systemmessage项目了。
对对,我忘记了,自己写的程序,还没仔细查看错误的原因在哪!!谢谢你拉!!!