-2

temp ....在调用 sprintf 或 snprintf 时使用错误。

如果复制发生在由于调用 sprintf() 或 snprintf() 而重叠的对象之间,则结果未定义。

4

1 回答 1

1

这不会引起 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 标准的部分作为已弃用的功能。

于 2011-03-08T05:47:31.773 回答