1
SErHo 2013-09-29 22:19:39 +08:00 via Android 1
你的代码中createlist 返回的到底是个什么东西?编译时不会报错,警告吗?
|
3
zorceta 2013-09-29 22:36:01 +08:00 via Android
C++为嘛不上new/delete
|
4
pomelowu 2013-09-29 22:38:13 +08:00 1
aCard inputcard;
是局部變量。 |
5
SErHo 2013-09-29 22:38:37 +08:00 via Android 1
主要就是插入节点的时候用的是局部变量inputcard,你应该使用malloc。
|
6
raptium 2013-09-29 22:39:13 +08:00
你为你 createlist 返回的东西在 stack 里
不在 heap 里 |
7
raptium 2013-09-29 22:39:25 +08:00
因为*
|
8
leunggamciu 2013-09-29 22:39:31 +08:00
上GDB,上单步,当你最终发现问题的时候你会有一种豁然开朗和想一刀捅死自己的感觉!
|
9
raptium 2013-09-29 22:42:47 +08:00 1
哦 说错了 不是 createlist,是 insertcard 里插入的东西
嗯 都是一个意思= = |
10
pathletboy 2013-09-29 22:45:21 +08:00 1
int insertc(list handcard)
{ aCard inputcard; list p; cin>>inputcard.data; inputcard.next=NULL; p=handcard; //check first card if (handcard->next==NULL) { cout<<"1st card"<<endl; handcard->next=&inputcard; return 0; } 妥妥的有问题 ,你inputcard是局部变量。 |
11
frogs 2013-09-29 23:05:19 +08:00
gcc -S
|
12
xdeng 2013-09-30 00:24:28 +08:00 via iPhone
查查字节对齐 这也是一个很坑爹的问题
|
13
lukic 2013-09-30 08:55:34 +08:00
|
14
helayzhang 2013-09-30 08:57:53 +08:00
9L正解
|
15
chchwy 2013-09-30 09:30:15 +08:00
http://www.v2ex.com/t/74249 [V2EX技巧] 贴图和贴代码的方法
|
16
KickTR OP @SErHo @raptium @pathletboy @pomelowu @lukic @helayzhang 感谢各位的相助,的确是局部变量问题,new之后就没事了。
这段代码其实还有诸多小错误,现在都已经差不多修正好了。 @zorceta 因为老师上课时是用VC演示,使用的cpp,但是代码正文却混合了c和c++极其不规范,还采用h头文件,他是用的malloc,当时我还不太了解,后来查了之后才知道c++中应该使用new不再需要malloc。这个老师的编程习惯也很不好,经常没有对齐的,哎。 @chchwy thx~ 感谢各位相助。不过我还是有一点不太明白,在单步跟踪时,既然inputcard是局部变量,完成了插入节点函数之后为什么对应inputcard的连在链表上的数据没有被立即销毁(变量监视中看到的)?而且可以继续在主函数里单独执行p=p->next,变量监视中也能显示正确连上去 |
17
pathletboy 2013-09-30 16:06:17 +08:00 1
@KickTR 内存销毁不是你想象的不可访问,只是在编译器中标记了这段内存无主了,其他人可以使用,局部变量是在堆栈中的,堆栈是编译器为线程申请的一块内存,一般为2M,由ebp/esp寄存器控制进行访问,在同个线程中,堆栈是给该线程调用的所有函数复用的。
|
18
KickTR OP @pathletboy 谢谢,意思是不是说,局部变量在所在函数结束后,变量对应空间的内容没有被立即清零,只是变量对应空间被标注可用,所以空间里存储的数据可能仍然存在,但是内容所处空间会随时可能被任何其他函数调用导致内容被修改?
|
19
pathletboy 2013-09-30 16:26:36 +08:00 1
@KickTR 嗯,是这样,如果没有其他函数对你那块堆栈值修改,那块内存你就可以一直使用,这有点像一块公共区域,你放置了一个东西,在其他人没搬走丢弃你的东西之前,你一直可以使用。
|
20
KickTR OP @pathletboy 十分感谢!
|
21
kelvin_fly 2013-10-01 09:36:37 +08:00
@KickTR 释放掉不代表清零,也不会清零。 请查询free的具体意义。
|