當我編譯這個程序時,我得到一些隨機數作爲輸出。在Cygwin中,輸出是47,但在RHEL5中,它給出了一些負的隨機數作爲輸出。 有誰能告訴我原因?
代碼:請解釋這種模糊性在C
main()
{
printf("%d");
}
當我編譯這個程序時,我得到一些隨機數作爲輸出。在Cygwin中,輸出是47,但在RHEL5中,它給出了一些負的隨機數作爲輸出。 有誰能告訴我原因?
代碼:請解釋這種模糊性在C
main()
{
printf("%d");
}
這一方案引發未定義行爲,因爲它不遵循C的規則,你應該格式字符串後給每個格式化說明printf
一個參數。
對於常見的C實現,它會在指向"%d"
的指針(指向整數)之後打印堆棧上發生的任何事情。在其他情況下,它可能會發送demons flying out of your nose。
+1,但它是錯誤的。打印堆棧中發生的事情是鼻後臺程序啓動過程的一部分。 –
沒關係(對於足夠小的ok值)給出比格式說明符更多的參數,如'printf(「%d \ n」,n,x ++);/*打印n並增加x * /'。額外的參數被評估並被忽略。 – pmg
@pmg:我說「應該」,而不是「必須」。我不認爲可以寫這樣的程序,除非你在IOCCC中競爭:) –
在3個計數:
printf
告訴它你發送1個參數和發送無return 0;
假設,但你的代碼是絕對不會C99)從main
值什麼都可以Happe的ñ。
第四計數:問題被標記爲' C',所以OP需要'int main(void)'。 –
@Joseph:正確的C99,但我認爲OP是使用C89 :) – pmg
printf需要第二個參數,所以它會讀取該位置堆棧上發生的任何事情。本質上它是讀取隨機存儲器並將其打印出來。
將編譯器的警告級別一直打開。然後編譯器會告訴你到底發生了什麼問題。 –
這就是'gcc -Wall -Wextra'。 –
@larsmans:和' - 錯誤',如果你感覺特別沒有警告。 –