代码之家  ›  专栏  ›  技术社区  ›  flavour404

遍历一个列表,每个项由一个结构中的一个结构组成,很难获取值

  •  0
  • flavour404  · 技术社区  · 14 年前

    我有一个列表,其中包含许多嵌套在mb结构(下面的def)中的内存基本信息结构。我遇到的问题是从嵌套的内存基本信息中获取信息。我正在使用迭代器遍历列表。从下面我知道错误是g-&g t;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 回复  |  直到 14 年前
        1
  •  1
  •   spacedentist    14 年前

    当发布这样的问题时,包含从编译器获得的特定错误消息总是非常有帮助的。

    乍一看,我不明白为什么你的代码不编译。但是,您应该知道,您对mbi2的赋值确实创建了整个内存基本信息结构的副本。(也许这就是问题的根源。)如果我正确理解您的案例,您可能不需要复制结构,因为您只想从中获取一些信息。

    试试这个:

    _MEMORY_BASIC_INFORMATION &mbi2=(*i)->mbi;
    

    如果不需要更改mbi2中的任何内容,则绝对应该使用const引用:

    const _MEMORY_BASIC_INFORMATION &mbi2=(*i)->mbi;
    

    永远记住,警察的正确性是你的朋友!

        2
  •  0
  •   Dialecticus    14 年前

    也许这就是你想要的:

    while(start < (char*)(g->mbi.BaseAddress) + mbi2.RegionSize)
    {
      ...
      start++;
    }
    

    可能是DWORD*而不是char*,我不知道RegionSize代表什么。

    BTW变量start应该是DWORD*,而不是DWORD。或者char*,没有提供太多信息。

        3
  •  0
  •   Benjamin Lindley    14 年前

    g是一个指针,你正确地用了:

    MEMORY_BASIC_INFORMATION mbi2 = g->mbi;
    

    你为什么要这么做?:

    start = (DWORD)g.mbi.BaseAddress;
    

    取消引用g,或者使用您已经声明的mbi2。

        4
  •  0
  •   baash05    14 年前

    在c++中,结构和类之间没有什么区别。
    所以,只为了搞笑,把单词struct的所有实例都改成类。

    当你这样做的时候,问题就变得更明显了。 你没有“g”对象,你有一个结构g。(PS错误的命名)

    采访问题:一个类和一个对象有什么区别?