我有編譯器錯誤:如何解決這個編譯器錯誤「格式字符串不是一個字面,沒有格式參數」
libvncserver/main.c:245: error: format not a string literal and no format arguments
和線路245:
fprintf(stderr,buf);
其中BUF是「字符BUF [256];」
我沒有看到245行有什麼問題,我該如何解決? 當我註釋掉該行時,程序將編譯。
我有編譯器錯誤:如何解決這個編譯器錯誤「格式字符串不是一個字面,沒有格式參數」
libvncserver/main.c:245: error: format not a string literal and no format arguments
和線路245:
fprintf(stderr,buf);
其中BUF是「字符BUF [256];」
我沒有看到245行有什麼問題,我該如何解決? 當我註釋掉該行時,程序將編譯。
什麼是錯的,任何printf
函數需要const char *
,而你是提供只是一個char *
。由於緩衝區可以包含任何你想要的東西,編譯器不能確定它將包含正確的格式字符串。只要做到
fprintf(stderr,"%s",buf);
,以便它一定會認爲你是不是要通過一些奇怪的事情。
如果buf
包含格式說明符如%s
,程序將嘗試讀取您沒有提供的參數,這可能會導致程序崩潰或損壞堆棧。海灣合作委員會正在警告你。它改成這樣:
fprintf(stderr, "%s", buf);
爲const char *參數提供'char *'參數沒有錯;其實這是相當普遍和正常的。 'const char *'參數意味着該函數承諾不修改參數字符串;它並不要求調用者提供一個持續的論據。 (答案的其餘部分或多或少是正確的,但我認爲icktoofay的答案更準確。) – ibid 2012-02-17 06:34:05
當您使用哈佛體系結構的CPU工作時,編譯器通常會在指令內存中存儲文字字符串。可寫緩衝區將位於數據存儲器中。在這種情況下,如果將參數聲明爲const char *,編譯器將生成指令以從指令存儲器(即FLASH)讀取數據。所以,一般來說不,如果一個函數需要一個文字,你不能傳遞一個可寫的緩衝區。不幸的是,'const char *'這個詞也被用來說'我不會修改你的緩衝區'......這就是混淆的根源。 – fabrizi0 2014-03-03 22:39:21