2012-02-16 58 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); 
相关问题