迭代列表,每个项目由结构中的结构组成,难以获取值

时间:2010-10-25 22:03:11

标签: c++ visual-studio-2008

我有一个列表,其中包含嵌套在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;*/

4 个答案:

答案 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的所有实例,它应该全部解决。

  

面试问题:一个类和一个对象有什么区别?