2011-11-24 52 views
-5

當我編譯這個程序時,我得到一些隨機數作爲輸出。在Cygwin中,輸出是47,但在RHEL5中,它給出了一些負的隨機數作爲輸出。 有誰能告訴我原因?
代碼:請解釋這種模糊性在C

main() 
{ 
printf("%d"); 
} 
+4

將編譯器的警告級別一直打開。然後編譯器會告訴你到底發生了什麼問題。 –

+1

這就是'gcc -Wall -Wextra'。 –

+2

@larsmans:和' - 錯誤',如果你感覺特別沒有警告。 –

回答

5

這一方案引發未定義行爲,因爲它不遵循C的規則,你應該格式字符串後給每個格式化說明printf一個參數。

對於常見的C實現,它會在指向"%d"的指針(指向整數)之後打印堆棧上發生的任何事情。在其他情況下,它可能會發送demons flying out of your nose

+3

+1,但它是錯誤的。打印堆棧中發生的事情是鼻後臺程序啓動過程的一部分。 –

+1

沒關係(對於足夠小的ok值)給出比格式說明符更多的參數,如'printf(「%d \ n」,n,x ++);/*打印n並增加x * /'。額外的參數被評估並被忽略。 – pmg

+1

@pmg:我說「應該」,而不是「必須」。我不認爲可以寫這樣的程序,除非你在IOCCC中競爭:) –

2

它是Undefined Behaviour

在3個計數:

  • 沒有原型採取可變數量的參數
  • 躺在printf告訴它你發送1個參數和發送無
  • 沒有返回一個函數(在C99一return 0;假設,但你的代碼是絕對不會C99)從main

什麼都可以Happe的ñ。

+0

第四計數:問題被標記爲' C',所以OP需要'int main(void)'。 –

+0

@Joseph:正確的C99,但我認爲OP是使用C89 :) – pmg

0

printf需要第二個參數,所以它會讀取該位置堆棧上發生的任何事情。本質上它是讀取隨機存儲器並將其打印出來。