簡體   English   中英

C代碼在Windows中崩潰,但在Linux中不崩潰

[英]C code crashes in Windows, but not in Linux

我是C的新手,並且已經在Fedora中使用gcc和gdb進行調試以測試程序。 我有一個程序需要用戶輸入。 如果輸入的第一個字符串是“ create”,那么我看一下第二個命令,如果輸入的是“ object”,那么我將繼續執行createObject函數。

希望我的代碼可以使這一點更加清晰:

static void parseCmd(char **input) {
    if(!strcmp(input[0], "create")) {
        if(!strcmp(input[1], "object")) {
            if(input[2] && strcmp(input[2], ""))
                createObject(input[2]);
            else
                printf("Object needs a name\n");
        }
        else
            printf("Command needs more parameters\n");
    }
    else
        printf("Command not recognized\n");
}

當我測試僅輸入“創建對象”時(對象后沒有空格,只有ENTER鍵)

在Linux中,它顯示“對象需要名稱”

但是在Windows中,程序崩潰了,只是掛起了。 如何更改代碼以使其行為與Linux中的行為相同?

您有這樣的代碼:

if(input[2] && strcmp(input[2], ""))

顯然試圖檢測input[2]是否存在並且不為空。

但是,這將不起作用。 無法保證缺少第三個參數會使input[2]為NULL或""

input[2]可能會有一個垃圾值,但是垃圾仍然可以通過您的測試!

您有一些解決方案。
要么,此函數的調用者需要確保未設置為有效數據的元素將改為設置為零/無。

或者,我更喜歡的方法是,將函數簽名更改為以下形式:

static void parseCmd(char **input, int num_inputs);

並將輸入數與輸入數組一起傳遞。

您在這一行有問題:

if(input[2] && strcmp(input[2], ""))

測試中的input [2]不存在“創建對象”,這說明了為什么崩潰。

希望這有幫助。

問候。

您已進入潛在的訪問沖突或未定義行為(很好,未定義值)的領域:

input[2] && strcmp(input[2], "")

如果input的長度只有2,則表示讀取超出了可接受的讀取點。 在最壞的情況下,這將導致段錯誤(就像Windows一樣),在最理想的情況下,操作系統會讓它發生,並且您將獲得隨機值。 (Linux似乎將它或* input [2]都視為0。)

無論如何,不​​要輸入不允許訪問的內容,而要輸入長度並檢查輸入內容。

static void parseCmd( char **input, size_t num) { //or just int if size_t isn't already defined
    //compare num
}

- 編輯 -

正如丹尼爾·菲舍爾(Daniel Fischer)所指出的,顯然argv[argc]確實是有效的讀取,並且可以保證它是一個空指針。

假設您確實將argv傳遞給該函數,這意味着您可以依賴此行為。 但是,您的另外兩個if語句不對此進行檢查,並且為了使函數通用化,最好沿長度傳遞(或者,如paulsm4所述,您應該研究getopt函數-它使參數解析更多比滾動自己的解析方法更容易)。

先生,您正在碰到您無權訪問的內存。

我推薦你

如何檢查指針是否有效?

任何想知道他如何傳遞事物的人:

int main(void) 
{ 
    char* values[] = {"1", "2", "3"};
    parseCmd(values);
} 

當您嘗試訪問輸入[2]時會發生這種情況,但是如果您不知道所要接收的內容,它可能會發生。我建議您在獲取輸入時進行健全性檢查。 如果他們沒有在值中添加任何內容[2],請讓您的函數意識到這一點或更改其處理方式。 使用指針和指向指針的指針,您可以在分配值時跳過完整性檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM