2013-03-02 24 views
-1

誰能告訴我爲什麼下面的代碼仍然有效?很明顯,在海峽[4]超出boundry的:c字符串仍然工作時出界?

#include<stdio.h> 
int main(){ 
    char str[3]; 
    scanf("%s", str); 
    printf("%c\n", str[4]); 
    printf("%s\n", str); 
    return 0; 
} 

在運行時,輸入abcdefg,它將呼應第五焦炭,整個字符串,沒有什麼 將是錯誤的,不可思議?

已經聲明c/C++沒有進行邊界檢查,而在上面的情況下, 我該如何使用printf打印用戶輸入的c字符串?或者更一般地說,如何正確使用來自用戶的C字符串?

+1

你運氣不好 – 2013-03-02 16:49:16

+1

因爲它是'c' – Anirudha 2013-03-02 16:53:13

回答

2

str [4]給你一個指向你的字符串最後一個元素後的內存地址的指針。您仍然可以將其轉換爲角色,但您永遠不知道自己會得到什麼,並且您的軟件可能會崩潰。

+0

是的,已經聲明c/C++沒有進行邊界檢查,而在上面的例子中,我應該如何使用printf打印一個c字符串用戶已進入?或者更一般地說,如何正確使用來自用戶的C字符串? – comeonfox 2013-03-03 02:20:21

+0

我認爲scanf是一般的危險,因爲它不會阻止緩衝區溢出,正如您在示例中所說明的那樣。有關此主題的討論,另見http://stackoverflow.com/questions/2430303/disadvantages-of-scanf。 – 2013-03-03 10:38:36

0

它爲什麼有效?

它不「工作」。它可能似乎正在工作,雖然;;因爲你的代碼(訪問一個數組越界)調用未定義的行爲,你可以從字面上得到任何結果。未定義的行爲並不意味着「它必須崩潰」。

0

您寫道:

在運行時,輸入[ABCDEFG],它將呼應了第5焦炭,整個 字符串,什麼都不會是錯誤的,不可思議?

,但我看不出有任何輸入閱讀您發佈的代碼:從str開始

#include<stdio.h> 
int main(){ 
    char str[3]; 
    printf("%c\n", str[4]); 
    printf("%s\n", str); 
    return 0; 
} 

在任何情況下,str[4]點到5個char(字節),所以它將在程序運行時打印恰好在該內存位置的任何「垃圾」。

訪問數組項越界是undefined行爲,所以沒有指定確切的行爲。 只要注意你的數組邊界。

+0

哦,我錯誤地刪除了該行,現在它已被添加。另一個問題:我應該如何正確使用(如'printf(「%s」,str)')一個來自用戶的c字符串? – comeonfox 2013-03-03 02:24:50