2013-09-24 23 views

回答

1

拿這個代碼例子 -

#include <stdio.h> 

int main(void){ 

    char a; 
    char b = '1'; 
    char c = '1'; 
    scanf("%s", &a); 

    printf("%c = %c\n", b, c); 
    return 0; 
} 

你希望它打印1 = 1,但剛纔當我跑它,它印= 1(至少在我的編譯器,不要指望任何來自穩定它)

scanf將一個字符串寫入a的地址,期望在那裏分配了足夠的空間(在這種情況下這是錯誤的),該字符串具有輸入字符和空終止符。在我的情況下,空終止符會覆蓋其他一些內存 - 即b。這是未定義的行爲 - 不要這樣做(至少在期望它沒有任何意義時)。

+0

感謝你,那是我想知道的。我從來沒有這樣做,我只是想知道爲什麼編譯器沒有給出任何警告。 – nmeln

+0

我猜如果編譯器發現char *傳遞給scanf是來自一個char變量的地址(而不是來自內存分配,數組或字符串),那麼可以實現一個警告,但這看起來很不重要,它也可能是合法的(如果你定義了char str [N]並且傳遞了&(str [0])) – Leeor

1

要麼使用格式%c來匹配單個的char,要麼使用%s來匹配一個字符串。

混淆它們(如在你的代碼中)是未定義的行爲,什麼都可能發生

相關問題