temp ....在调用 sprintf 或 snprintf 时使用错误。
如果复制发生在由于调用 sprintf() 或 snprintf() 而重叠的对象之间,则结果未定义。
这不会引起 gcc 的警告,即使是-Wall -Wextra -pedantic
:
#include "stdio.h"
int main (void) {
char xx[1000] = "hello";
sprintf (xx, "xyzzy plugh %s", xx);
printf ("%s\n", xx);
return 0;
}
但是,从输出中可以看出这被认为是一个坏主意的原因。而不是得到:
xyzzy plugh hello
正如普通人所期望的那样,您实际上得到:
xyzzy plugh xyzzy plugh
但是,与所有未定义的行为一样,您的里程可能会有所不同。
最终参考是 C99 标准,第 部分7.19.6.6 The sprintf function
,其中指出:
sprintf 函数等价于 fprintf,除了输出写入数组(由参数 s 指定)而不是流。在所写字符的末尾写一个空字符;它不计为返回值的一部分。如果复制发生在重叠的对象之间,则行为未定义。
C++ 标准(嗯,实际上是 C++0x草案,但现在肯定会到期,希望 - 来吧,伙计们,把它放在那里)引用了这一点,因为它包含了 C 标准的部分作为已弃用的功能。