2015-09-28 77 views
-4

我在執行下面的代碼時得到輸出「ma」。如果我的理解是正確的,局部變量不會被初始化爲0.所以在這種情況下,%s在a1 [2]本身中如何找到0?難道我們無法預測這種情況下的輸出結果嗎?我總是得到這個結果,但情況可能並非總是如此?未初始化的字符數組

int main(void) 
{ 
    char a1[10]; 
    a1[0]='m'; 
    a1[1]='a'; 
    a1[3]='j'; 
    printf("%s",a1); 
    return(0); 
} 
+6

'a1'是如何定義的? – juanchopanza

+0

這不是整個代碼。這給出了「編譯錯誤」。顯示如何聲明'a1'。 – vish4071

+0

請通過添加缺少的代碼來修復您的問題。 – juanchopanza

回答

3

是的,除非a1static,是一個自動局部變量,這是所有由運氣。您的代碼(代碼段)由於缺少終止的null而產生undefined behavior

它只是恰好有下一個字節爲null,所以它正在打印正確。它無處保證它會在下一次工作。

FWIW,%s格式說明期望一個和在C 的定義是一種封端的null陣列char。要複製的確切措辭,

如果沒有l長度改性劑的存在,該參數將是指向字符類型的數組的初始元素。 [..]如果未指定精度或大於數組大小,則數組應包含空字符。


注:相關static變量的初始化,引用C11標準,章§6.7.9,初始化,(重點煤礦

如果具有自動存儲對象持續時間爲未明確初始化,其值爲 不確定。如果具有靜態或線程存儲時限的對象未初始化明確,則:

  • [...]

  • 如果它已經算術類型,它被初始化爲(正或無符號)零;

+3

沒有足夠的信息來了解這一點。 – juanchopanza

+0

@juanchopanza先生,試圖添加一些澄清。 :) –

+0

@Meehm對,相應更新。 –