我有编译器错误:如何解决这个编译器错误“格式字符串不是一个字面,没有格式参数”
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