2011-08-23 52 views
3

方案1: 代碼:爲什麼我用isdigit()得到分段錯誤?

int main(){ 
    int a = 12345678; 

    if(isdigit(a)){ 
     printf("ok: foo\n"); 
    } 
    else{ 
     printf("false: bar\n"); 
    } 
    printf("test\n"); 

    return EXIT_SUCCESS; 
} 

輸出:

Segmentation fault 

方案2: 代碼:

... 
    if(isdigit(a)){ 
     //printf("ok: foo\n"); 
    } 
    else{ 
     //printf("false: bar\n"); 
    } 
    printf("test\n"); 
... 

輸出:

test 

現在最後,代碼:

... 
int a = 1234567; 
... 

輸出:

ok: foo 
test 

這有什麼錯ISDIGIT()?我不明白!

回答

1

這很可能是編譯器優化的。由於無論是否做某事,它都被刪除,並且isdigit最終未被調用。一定要

#include <ctype.h> 

分割故障可能是由事實來,你傳遞一個(不那麼小)號碼,當一個字符預期。當你刪除printf語句並且編譯器優化它時,調用不會發生,因此不會失敗。

請注意,實際上可以省略標題,因爲默認情況下程序將與標準C庫鏈接,因此它可以工作。但這不是一個好主意,至少應該看到一個警告。

+0

我不會忘記#include :)我可以編譯這個小程序沒有錯誤。 – krzym

+0

@krzym啊,好的。我用更多的信息編輯了答案。 – sidyll

+0

@krzym:我不能。有些編譯器比其他編譯器更挑剔,但應包含。 –

1

首先,isdigit(3)檢查字符是否是數字。

由於您沒有包含stdio.h,可能會出現分段錯誤(我是肯定的)。

然後你打電話printf它使用可變參數而不知道它的原型(未定義的行爲)。

+0

崩潰並不是因爲缺少任何包含文件。我也不明白你的最後一點。如果C編譯器/鏈接器無法找到該函數,則會報告錯誤。 – Karlth

+0

@ user357320,不,它不會有。也許警告,如果配置正確,而不是關於函數的定義,它是關於它的聲明。 –

2

這是因爲可以ISDIGIT這樣

你打電話ISDIGIT與整數值被定義爲宏,但圖陣列大小是256個元素。在這種情況下,您嘗試讀取數組範圍外的值 - >分段錯誤。這種分段故障可以隨機發生。取決於您的程序或數據大小。

相關問題