我有一个列表,其中包含嵌套在mb结构中的多个_MEMORY_BASIC_INFORMATION结构(下面的defs)。我遇到的问题是从嵌套的_MEMORY_BASIC_INFORMATION中获取信息。我正在使用迭代器来遍历列表。从下面我知道错误是g-> mbi;但我不知道我应该如何引用嵌套结构...谢谢。
基本上我试图将基地址从gMemList [i]写入start =(DWORD)g.mbi.BaseAddress;但我收到错误c2228:'.mbi'左边必须有一个类/结构/联合。
list<struct mb *> gMemList
std::list<mb *>::iterator i = gMemList.begin();
while(i != gMemList.end())
{
struct mb *g = *i;
MEMORY_BASIC_INFORMATION mbi2 = g->mbi;
start = (DWORD)mbi2.BaseAddress;
buf = new wchar_t[255];
while(start < mbi2.RegionSize)
{...
//struct mb
//{
// MEMORY_BASIC_INFORMATION mbi;
// char *p;
//};
/*typedef struct _MEMORY_BASIC_INFORMATION {
PVOID BaseAddress;
PVOID AllocationBase;
DWORD AllocationProtect;
SIZE_T RegionSize;
DWORD State;
DWORD Protect;
DWORD Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;*/
答案 0 :(得分:1)
发布此类问题时,包含从编译器中获取的特定错误消息总是非常有用。
乍一看,我看不出你的代码为什么不编译。但是,您应该知道,您对mbi2的分配确实会创建整个_MEMORY_BASIC_INFORMATION结构的副本。 (也许这就是问题的根源。)如果我理解你的情况,你可能不需要复制结构,因为你只想从中获取一些信息。
试试这个:
_MEMORY_BASIC_INFORMATION &mbi2=(*i)->mbi;
如果您不需要更改mbi2中的任何内容,则应该使用const引用:
const _MEMORY_BASIC_INFORMATION &mbi2=(*i)->mbi;
永远记住,const-correctness是你的朋友!
答案 1 :(得分:0)
也许这就是你要找的东西:
while(start < (char*)(g->mbi.BaseAddress) + mbi2.RegionSize)
{
...
start++;
}
可能是DWORD *而不是char *,我不知道RegionSize代表什么。
BTW变量start应该是DWORD *,而不是DWORD。或char *,提供的信息不多。
答案 2 :(得分:0)
g是一个指针,你说得对:
MEMORY_BASIC_INFORMATION mbi2 = g->mbi;
你为什么要这样做?:
start = (DWORD)g.mbi.BaseAddress;
取消引用g,或使用已经声明的mbi2。
答案 3 :(得分:0)
我认为问题是你使用struct这个词。 在c ++中,struct和class之间几乎没有区别 所以,只是为了giggles将单词struct的所有实例更改为class。
当你这样做时,问题变得更加明显。 你没有“g”对象,你有一个结构g。 (PS BAD NAMING)
从此代码中拉出单词struct的所有实例,它应该全部解决。
面试问题:一个类和一个对象有什么区别?