首先输入 gcc memu.c linktable.c -o memu 进行编译函数
发现提示warning,缘由是没有导入头文件,须要导入#include <string.h>ui
从新编译,显示成功spa
运行编译完的文件 memu ,输入help 发现还有quit命令,输入quit命令后报错。3d
打开源代码进行分析。发现当 p 为空时,会输出 This is a wrong cmd !指针
进入到FindCmd函数进行查看调试
很明显,FindCmd 执行完SearchLinkTableNode后返回空字符串,进入到此函数进行缘由分析blog
而后发现,只有pNode不为空且 不等于pLinkTable->pTail时,才会返回pNode指针。问题应该就出如今这。事件
因为help能成功执行,那么问题必然出如今不等于pLinkTable->pTail 字符串
经过查看初始化,发现quit是最后一个。那么显然,上面循环体判断条件,若是不是最后一个,就进入循环,致使了最后一个节点不会被遍历到get
而最后一个节点的pNext会置为空。因此咱们将条件改成 pNode != null 即可完成!
能够看到,修改后成功了!
用GDB调试
从新编译后,进入GDB环境,在101行打断点,而后执行run命令。
(gdb) break 101 Breakpoint 1 at 0x400dbd: file menu.c, line 101. (gdb) run Starting program: /home/sun/桌面/lab5.1/memu Breakpoint 1, main () at menu.c:103 103 InitMenuData(&head); (gdb) n 107 printf("Input a cmd number > "); (gdb) n 108 scanf("%s", cmd); (gdb) n Input a cmd number > quit //输入quit 109 tDataNode *p = FindCmd(head, cmd); //按s进入单步调试 (gdb) s FindCmd (head=0x603010, cmd=0x6020a0 <cmd> "quit") at menu.c:60 60 return (tDataNode*)SearchLinkTableNode(head,SearchCondition); //按s进入函数内部查看 (gdb) s SearchLinkTableNode (pLinkTable=0x603010, Conditon=0x400bf3 <SearchCondition>) at linktable.c:144 144 if(pLinkTable == NULL || Conditon == NULL) (gdb) n 148 tLinkTableNode * pNode = pLinkTable->pHead; (gdb) n 149 while(pNode != pLinkTable->pTail) (gdb) n 151 if(Conditon(pNode) == SUCCESS) (gdb) n 155 pNode = pNode->pNext; (gdb) n 149 while(pNode != pLinkTable->pTail) (gdb) n 151 if(Conditon(pNode) == SUCCESS) (gdb) n 155 pNode = pNode->pNext; (gdb) n 149 while(pNode != pLinkTable->pTail) (gdb) n 157 return NULL;//能够看到,在三层循环后,返回了null (gdb) n 158 } (gdb) n FindCmd (head=0x603010, cmd=0x6020a0 <cmd> "quit") at menu.c:61 61 } (gdb) n main () at menu.c:110 110 if( p == NULL) (gdb) n 112 printf("This is a wrong cmd!\n "); (gdb) n This is a wrong cmd! 113 continue;
回调函数