1

我有一个简单的递归结构Recursive,我想用程序需要的值初始化它的 const 数组。然后我将使用一个名为的简单迭代器函数IterateAux,并在main. 看代码到现在:

#include <iostream>
#include <string>

struct Recursive
{
    std::string data;
    Recursive* Children;
};

void IterateAux(Recursive* Item)
{
    int i = -1;
    while (Item[++i].data != "")
    {
        std::cout << Item[i].data << "\n";
        if (Item[i].Children)
            IterateAux(Item[i].Children);
    }
}

int main()
{
    IterateAux( (Recursive*)Parent );
    return 0;
}

现在,如果我有这样的 const 数组,它可以工作:

const Recursive Children[] =  {
    {"Child1", NULL},
    {"Child2", NULL},
    {"", NULL}
};

const Recursive Parent[] = {
    {"Parent1", NULL},
    {"Parent2", NULL},
    {"Parent3", Children },
    {"", NULL}
};

但以下嵌套形式不会:

const Recursive Parent[] = {
    {"Parent1", NULL},
    {"Parent2", NULL},

    {"Parent3", (Recursive[])
        {
            {"Child1",NULL},
            {"Child2",NULL},
            {"", NULL}
        }
    },
    {"", NULL}
};

问题是为什么?我怎样才能让它工作?

在我的调查中,起初我认为.children指针可能无效,但是当尝试使用int数据而不是std::string它时,它可以完美地工作。

随着std::string数据 GDB 与消息一起崩溃,During startup program exited with code 0xc0000135.所以我什至无法调试程序!也许数组初始化代码在某处弄得一团糟……

在 GCC 4.6 上尝试了所有这些。

4

1 回答 1

0

通过一些工作,我可以让它出现在 gdb 中。在 IterateAux 的 while 语句处设置断点。它通过 Parent 很好,然后当 t 到达 Children 案例时,我在工作案例中看到了这个:

(gdb) p Item[0]
$2 = {data = "Child1", Children = 0x0}

这在失败的情况下:

(gdb) p Item[0]
$2 = {data = <error reading variable: Cannot access memory at address 0xfffffff4>,
Children = 0x48d24d79}

所以看起来对 Recursive[] 的强制转换隐藏了它没有编译为与第一种情况相同的形式的事实。

我正在使用带有 -Wall 的 g++ 4.6.3 进行编译,并且没有收到任何警告。

于 2012-05-19T14:19:42.770 回答