我有一个名为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上尝试了所有这些。
答案 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并且没有警告。