我有一个使用 sprintf 的简单代码
#include <stdio.h>
int main()
{
char str_src [1024]={"Hello"};
sprintf(str_src,"%s%s",str_src,"hiiiiiiiiiii");
printf("result = %s",str_src);
}
当我编译时,我得到正确的结果:
结果=你好嗨iiiiiiiiii
但由于 sprintf 不安全,我决定将其更改为 snprintf。我以为这会很简单。我将 sprintf 更改为 snprintf,如下所示
snprintf(str_src,1024,"%s%s",str_src,"hiiiiiiiiiii");
现在如果我编译并运行代码,我会得到不同的结果
结果 = hiiiiiiiiii
如果我使用 str_src 作为第四个参数(作为 %s 的值),我会遇到这个问题。令人惊讶的是为什么 snprintf 的行为与 sprintf 不同?
It's 未定义的行为使用相同的缓冲区作为目标和源。
来自 C11 规范 (7.21.6.6/2):
如果复制发生在重叠的对象之间,则行为未定义。
同样的说法是snprintf
(7.21.6.5/2),以及va_list
变种也是如此。
不幸的是,这在运行代码中很常见,但不能真正依赖它来工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)