看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) Ubuntu 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) No 問題(Question): 這程式是要模擬一個linux shell 前面讓使用者輸入字串之後再進行字串切割 並在最後放置\0 例如輸入 ls 會存進 char **arg內 此時 *arg[0] = ls //count = 2 now 然後在 *argv[1]這個位置 放置 '\0' ---- (ubnutu 18.04,gcc version:7.4.0) -> *newArgv[count-1]='\0';//程式碼57行處 ---- 之後再將這個arg 傳遞到另一個function : void run(char** argv)內 執行execvp(argv[0],argv); 但就會出現 ls: cannot access '': No such file or directory 1.問題是為什麼 execvp 會讀取到這個 null? 我知道\0在字串中就是 null 所以可能會被當作參數去讀取 可是又會需要到這個\0 去計算現在argv中有幾個token while(*argv[i]!='\0'){ //這個while迴圈在另一個function內->free_arg(char **argv ) ++i; } 該怎麼解決execvp這個問題 2.如果我將上面改成 ---- (ubnutu 16.04,gcc version:5.4.0) -> newArgv[count-1]='\0';//程式碼57行處 ---- 在ubnutu 16.04下可以正常運作指令 不會出現任何錯誤 但是如果在18.04下 上面這行程式碼就會出現segmenation fault 這個seg. fault 我知道是在free()的時候爆炸 問題1.為什麼會有這樣子的差異 (16.04下不會有問題 18.04就會出現seg. fault) 問題2.在這個\0一定要存在的情況下要如何不讓execvp讀取到這個null參數 可以正常的 執行 餵入的資料(Input): ls 預期的正確結果(Expected Output): 正確的列出ls的結果 錯誤結果(Wrong Output): ls: cannot access '': No such file or directory 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 112.105.238.216 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1537526692.A.A0E.html
dododavid006: execvp 要的是以 NULL 指標結尾的字串陣列 你這樣寫09/21 19:05
dododavid006: 是個 "\0" 字串09/21 19:05
一語驚醒夢中人 改成等於null可以了 感謝 已解決 ※ 編輯: achicn3 (112.105.238.216), 09/21/2018 19:21:17