定义嵌套的递归结构数组

时间:2012-05-19 13:04:36

标签: c++ arrays struct pod

我有一个名为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上尝试了所有这些。

1 个答案:

答案 0 :(得分:0)

通过一些工作,我可以在gdb中找到它。在IterateAux中的while语句中设置断点。它通过父母罚款,然后当到达儿童案例时,我在工作案例中看到了这一点:

(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并且没有警告。