2012-02-16 31 views

回答

7

什麼是錯的,任何printf函數需要const char *,而你是提供只是一個char *。由於緩衝區可以包含任何你想要的東西,編譯器不能確定它將包含正確的格式字符串。只要做到

fprintf(stderr,"%s",buf); 

,以便它一定會認爲你是不是要通過一些奇怪的事情。

+4

爲const char *參數提供'char *'參數沒有錯;其實這是相當普遍和正常的。 'const char *'參數意味着該函數承諾不修改參數字符串;它並不要求調用者提供一個持續的論據。 (答案的其餘部分或多或少是正確的,但我認爲icktoofay的答案更準確。) – ibid 2012-02-17 06:34:05

+0

當您使用哈佛體系結構的CPU工作時,編譯器通常會在指令內存中存儲文字字符串。可寫緩衝區將位於數據存儲器中。在這種情況下,如果將參數聲明爲const char *,編譯器將生成指令以從指令存儲器(即FLASH)讀取數據。所以,一般來說不,如果一個函數需要一個文字,你不能傳遞一個可寫的緩衝區。不幸的是,'const char *'這個詞也被用來說'我不會修改你的緩衝區'......這就是混淆的根源。 – fabrizi0 2014-03-03 22:39:21

3

如果buf包含格式說明符如%s,程序將嘗試讀取您沒有提供的參數,這可能會導致程序崩潰或損壞堆棧。海灣合作委員會正在警告你。它改成這樣:

fprintf(stderr, "%s", buf); 
相關問題