只提供格式化字串而無其他實參,printf最後會列印格式化字串。但為什麼之後會迴圈列印同樣的內容

時間 2021-06-30 14:05:50

1樓:C十十20年

參見《C++程式設計精要教程》之實參通過棧傳給形參。printf的定義為int printf(const char*f, ...),第乙個形參為格式化串f,後面可接仼意個任意型別的引數,返回值為實際列印的字元個數。

例如乙個正整數x的十進位制有效數字位數=printf("%d", x)。x的值和字串"%d"的位址都作為實參出現在棧上。假定你接著只寫printf("%d"),會繼續列印出乙個數值出來,因為編譯會從棧上取值列印,不管你是不是真的通過壓棧傳了實參。

這裡還會涉及乙個問題,實參壓棧是自左至右的,還是自右至左的?而國際標準並未規定,所以不同編譯器呼叫同樣的函式,可能會得到不同的列印結果。另外C語言認為棧上存貯的變數為自動變數,例如,函式內部未使用static和register定義的區域性變數,預設為自動變數即auto型變數,auto型變數都是在棧上分配記憶體的。

printf(argv[1])和printf(buff)都能列印出字串行,因為argv[1]和buff都是字元陣列,都可以作為實參傳給printf函式的形參f。printf(argv[1])和printf(buff)的不同之處在於:字元陣列的分配位置,argv[1]不一定在棧上;而buff作為auto型即自動變數,則一定分配在棧上。

因此,使用printf(buff)會出現多個實參在棧上的內容首尾相接的情況(包括以前呼叫函式的殘留內容),列印結果不同自然不足為奇。

為什麼列印字串符之前要格式化,這個格式化是什麼意思?

OhYee 列印字串前不一定要格式化,但是如果需要對變數進行拼接,一般使用格式化 格式化是指將變數以及字串常量拼接成符合特定格式要求的字串 首先,不是必需格式化。比如直接輸出hello world就可以直接輸出 print hello world 但是當輸出的內容有格式要求時,則需要對其格式化 格式...

u盤格式化,怎麼恢復

失易得資料恢復 U盤格式化之後,如果沒有往U盤裡再寫入新的資料,恢復概率還是挺高的,使用失易得資料恢復軟體 easyrecovery 快易資料恢復軟體或者其他軟體進行恢復。有幾點需要注意的 1 切記需要先掃瞄預覽一下,看看是否有誤格式化的檔案,資料恢復都不是100 的,所以需要先預覽,如果同類軟體不...

如何用最通俗的語言解釋 格式化 ?

流刃若火 我理解的格式化,類似於一家圖書館 資料集合 你把圖書目錄 索引 給撕了,你之後完全找不到你想要的書 資料 但其實書 資料 還在,只是你找不到了,你要真正的清理資料,只能把圖書館的書全部換一遍 格式化還不簡單。硬碟上乙個格仔乙個格仔檢查一下有沒有問題,可否正常讀寫。另外C盤裡的檔案是樹狀的你...