全局变量在return之后变化,请大家帮忙看下是哪里的问题
功能:在listview中双击某一行,弹出窗口显示对应的结构图来。
双击函数:
ClistView::OnLButtonDbClk(UINT nFlag,CPoint point){ CListCtrl &clsList = GetListCtrl(); POSITION pos = clsList.GetFirstSelectedItemPosition(); if(pos == NULL) return; int nItem = clsList.GetNextSelectedItem(pos); CString strPoint = clsList.GetTextText(nItem,5); //获取点击的内容 CDlgShowStruct dlg;//弹出的显示窗口 DWORD nCnt = theApp.m_dwStructNum; //传到app里面,接收到的结构总数 BOOL bFound = FALSE; int i = 0; for(i = 0;i<nCnt;i++) { if(theApp.m_MsgStr[i].szMsgID.CompareNoCase(strPoint) == 0) { bFound = TRUE; memcpy(&dlg.msgItem,&theApp.m_MsgStr[i],sizeof(theApp.m_MsgStr[i]));//将匹配的结构拷入对话框的变量 break; } } if(bFound) dlg.DoModul(); return;//此处之后出问题}//这里的MsgStr和MsgItem有相同的结构typedef struct MsgStruct_S{ int nMsgID; int nStructNum;//包含的结构的个数 CString szMsgID;//结构ID 的字符串表示 CString szTypeName[128];//该ID下的结构的各个名称 CString szTypeInfo[128];//名称对应的类型};//上面这个的结构就类似我们VC的watch窗口里面,当我们要选择某个变量查看其具体结构时的样子//该List的显示样子Index MsgID MsgContent ...0001 CCL_DLL_XXX 01 01 01 01...0002 DLL_SP_XXX FF FF 0F 0F......CString::~CString(){ if(GetData()!=_afxDataNil) if(InterLockedDecrement(&GetData->nRef)) FreeData(GetData());}//进入这里这个函数2次,在return那里F9,这是为什么?//比如我该字段的保存地址是0x00a93e1c,保存uint 16这个字符串,然后在其上的12个字节处为02,弹出一次后变为01,再一次就变为了DD,并且在本地址所在行以上的48个字节均变为DD,这个字段是theApp.m_MsgStr中一个结构的地址,就只属于这个部分的地址内容变化了,保存的其他结构的内容均没有变化,这个是为什么呢?示意图0x00000001 12 12 23 32 32 32 32 32 32 32 43 320x0000000d ff 43 65 76 87 89 21 df fd 43 65 760x0000001a 02 dd ff ff ee ff ee ff ee ff ee ff0x00000026 57 91 83 90 76 33 ed cd a7 88 98 90 //这行才是我储存数据的地址,数据内容是假的,具体的忘了0x000000xx xx.....//储存的其他数据然后第一次弹出并运行到return后,0x0000001a ——>01 dd ff ff ....//变为了这个,然后在双击弹出对话框//然后再次运行到return处0x00000001 ——>0x00000026均变为了DD,而我在其他的地方都没有使用保存好的结构,或者说,我在弹出框返回后,就只是在单纯的双击让它弹出对话框,但它在第三次开始,第二次return之后,数据就变化了,实在想不出什么理由来,希望能有人帮个忙看看