user-0 提问: 多个结构体相互嵌套，变量初始化有问题，使用vector导致栈溢出

回复:
user: user-1
content: 引用 13 楼 qq_26303031 的回复:[quote=引用 10 楼 jack960330 的回复:] [quote=引用 8 楼 qq_26303031 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。 谢谢，根据你的方法，找到了问题所在，暂时解决了[/quote]  你指针是NULL  就不能使用这个指针。。。[/quote] 我知道问题在哪了，因为我定义函数时， c_node InsertBETree(Event sub, c_node cnode, c_directory cdir，vector <string> attrMatched) 也算把attrMatched初始化了。[/quote]  恭喜

user: user-0
content: 引用 10 楼 jack960330 的回复:[quote=引用 8 楼 qq_26303031 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。 谢谢，根据你的方法，找到了问题所在，暂时解决了[/quote]  你指针是NULL  就不能使用这个指针。。。[/quote] 我知道问题在哪了，因为我定义函数时， c_node InsertBETree(Event sub, c_node cnode, c_directory cdir，vector <string> attrMatched) 也算把attrMatched初始化了。

user: user-0
content: 引用 10 楼 jack960330 的回复:[quote=引用 8 楼 qq_26303031 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。 谢谢，根据你的方法，找到了问题所在，暂时解决了[/quote]  你指针是NULL  就不能使用这个指针。。。[/quote] 我想定义一个vector<string>attrMatched，任何一个函数里面改变它之后，这个改变都会一直传下去，不需要用return才能把改变后的值传回去。static vector<string>attrMatched不行啊。我得怎么定义

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。 谢谢，根据你的方法，找到了问题所在，暂时解决了

user: user-0
content: 引用 6 楼 jack960330 的回复:[quote=引用 4 楼 qq_26303031 的回复:] [quote=引用 2 楼 jack960330 的回复:] 用你查看函数堆栈的功能，能知道到底发生了什么  我不会看堆栈，我猜问题出在了InsertBETree(subscription_set1,*cnode,cdir,attrMatched);这里。 但是我改代码，只考虑subscription_set1时  Event Insert(Event sub) { 	predicate pred = { "B", "<", 2 }; 	for (int i = 0; i < 2; i++) 	{ 		sub.pred.push_back(pred); 	} 	return sub; } int main() { //前面不写了 for (int i = 0; i < 3; i++) 	{ 		Event sub = subscription_set1; 		sub=Insert(sub); 		cout << sub.pred.size() << endl; 	} }  并没有出现问题，完美运行[/quote] 根据堆栈 ，问题发生在InsertBETree函数里[/quote]  恩，根据5楼给的方法，发现确实是发生在InsertBETree里面。里面有个*cnode.lnode=Insert(sub, *cnode.lnode);函数，好像是地址有问题。试了下写个小代码          Event subscription_set1= { { predicate("a", "=", 1), predicate("B", "<", 2), predicate("C", "<", 2) } };         Lnode lnode1; 	Lnode *lnode2; 	lnode2 = NULL; 	lnode1.saveSub.push_back(subscription_set1); 	(*lnode2).saveSub.push_back(subscription_set1);  lnode1.saveSub.push_back(subscription_set1);可以执行，(*lnode2).saveSub.push_back(subscription_set1)报错和我发帖时出现的错误一样，应该是定义vector指针的问题吧。没办法，我只能不用指针了，问题倒是解决了，但还不知道其他地方是不是需要指针

user: user-1
content: 引用 4 楼 qq_26303031 的回复:[quote=引用 2 楼 jack960330 的回复:] 用你查看函数堆栈的功能，能知道到底发生了什么  我不会看堆栈，我猜问题出在了InsertBETree(subscription_set1,*cnode,cdir,attrMatched);这里。 但是我改代码，只考虑subscription_set1时  Event Insert(Event sub) { 	predicate pred = { "B", "<", 2 }; 	for (int i = 0; i < 2; i++) 	{ 		sub.pred.push_back(pred); 	} 	return sub; } int main() { //前面不写了 for (int i = 0; i < 3; i++) 	{ 		Event sub = subscription_set1; 		sub=Insert(sub); 		cout << sub.pred.size() << endl; 	} }  并没有出现问题，完美运行[/quote] 根据堆栈 ，问题发生在InsertBETree函数里

user: user-1
content: 引用 7 楼 qq_26303031 的回复:[quote=引用 6 楼 jack960330 的回复:] [quote=引用 4 楼 qq_26303031 的回复:] [quote=引用 2 楼 jack960330 的回复:] 用你查看函数堆栈的功能，能知道到底发生了什么  我不会看堆栈，我猜问题出在了InsertBETree(subscription_set1,*cnode,cdir,attrMatched);这里。 但是我改代码，只考虑subscription_set1时  Event Insert(Event sub) { 	predicate pred = { "B", "<", 2 }; 	for (int i = 0; i < 2; i++) 	{ 		sub.pred.push_back(pred); 	} 	return sub; } int main() { //前面不写了 for (int i = 0; i < 3; i++) 	{ 		Event sub = subscription_set1; 		sub=Insert(sub); 		cout << sub.pred.size() << endl; 	} }  并没有出现问题，完美运行[/quote] 根据堆栈 ，问题发生在InsertBETree函数里[/quote]  恩，根据5楼给的方法，发现确实是发生在InsertBETree里面。里面有个*cnode.lnode=Insert(sub, *cnode.lnode);函数，好像是地址有问题。试了下写个小代码          Event subscription_set1= { { predicate("a", "=", 1), predicate("B", "<", 2), predicate("C", "<", 2) } };         Lnode lnode1; 	Lnode *lnode2; 	lnode2 = NULL; 	lnode1.saveSub.push_back(subscription_set1); 	(*lnode2).saveSub.push_back(subscription_set1);  lnode1.saveSub.push_back(subscription_set1);可以执行，(*lnode2).saveSub.push_back(subscription_set1)报错和我发帖时出现的错误一样，应该是定义vector指针的问题吧。没办法，我只能不用指针了，问题倒是解决了，但还不知道其他地方是不是需要指针 [/quote]  你指针是NULL  就不能使用这个指针。。。

user: user-1
content: 引用 8 楼 qq_26303031 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。 谢谢，根据你的方法，找到了问题所在，暂时解决了[/quote]  你指针是NULL  就不能使用这个指针。。。

user: user-1
content: 引用 7 楼 qq_26303031 的回复:[quote=引用 6 楼 jack960330 的回复:] [quote=引用 4 楼 qq_26303031 的回复:] [quote=引用 2 楼 jack960330 的回复:] 用你查看函数堆栈的功能，能知道到底发生了什么  我不会看堆栈，我猜问题出在了InsertBETree(subscription_set1,*cnode,cdir,attrMatched);这里。 但是我改代码，只考虑subscription_set1时  Event Insert(Event sub) { 	predicate pred = { "B", "<", 2 }; 	for (int i = 0; i < 2; i++) 	{ 		sub.pred.push_back(pred); 	} 	return sub; } int main() { //前面不写了 for (int i = 0; i < 3; i++) 	{ 		Event sub = subscription_set1; 		sub=Insert(sub); 		cout << sub.pred.size() << endl; 	} }  并没有出现问题，完美运行[/quote] 根据堆栈 ，问题发生在InsertBETree函数里[/quote]  恩，根据5楼给的方法，发现确实是发生在InsertBETree里面。里面有个*cnode.lnode=Insert(sub, *cnode.lnode);函数，好像是地址有问题。试了下写个小代码          Event subscription_set1= { { predicate("a", "=", 1), predicate("B", "<", 2), predicate("C", "<", 2) } };         Lnode lnode1; 	Lnode *lnode2; 	lnode2 = NULL; 	lnode1.saveSub.push_back(subscription_set1); 	(*lnode2).saveSub.push_back(subscription_set1);  lnode1.saveSub.push_back(subscription_set1);可以执行，(*lnode2).saveSub.push_back(subscription_set1)报错和我发帖时出现的错误一样，应该是定义vector指针的问题吧。没办法，我只能不用指针了，问题倒是解决了，但还不知道其他地方是不是需要指针 [/quote]  指针要小心使用

user: user-2
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-1
content: 用你查看函数堆栈的功能，能知道到底发生了什么

user: user-0
content: 引用 2 楼 jack960330 的回复:用你查看函数堆栈的功能，能知道到底发生了什么  我不会看堆栈，我猜问题出在了InsertBETree(subscription_set1,*cnode,cdir,attrMatched);这里。 但是我改代码，只考虑subscription_set1时  Event Insert(Event sub) { 	predicate pred = { "B", "<", 2 }; 	for (int i = 0; i < 2; i++) 	{ 		sub.pred.push_back(pred); 	} 	return sub; } int main() { //前面不写了 for (int i = 0; i < 3; i++) 	{ 		Event sub = subscription_set1; 		sub=Insert(sub); 		cout << sub.pred.size() << endl; 	} }  并没有出现问题，完美运行

user: user-0
content: 引用 1 楼 user-3 的回复:0x00000008 你这是指针指向了非法地址吧。。这种地址应该不会用到的 你看下你那个指针怎么赋值和运算的 不知道指针怎么赋值了啊，因为定义的结构体相互嵌套，我都不清楚怎么初始化和赋值了

user: user-3
content: 0x00000008 你这是指针指向了非法地址吧。。这种地址应该不会用到的 你看下你那个指针怎么赋值和运算的