首先輸入 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;
回調函數