none
这个程序中的指针错误在哪? RRS feed

  • 问题

  • #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 时发生访问冲突
    不知道是什么原因。
    等待解答。





    2010年1月14日 12:07

答案


  • 	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
    2010年1月14日 12:26
    版主

全部回复


  • 	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
    2010年1月14日 12:26
    版主

  • 	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:12