【发布时间】:2018-06-20 08:05:28
【问题描述】:
为了安全起见,我知道使用 snprintf() 代替 sprintf()。但是,我总是对snprintf() 使用的缓冲区执行memset()。我看到一些代码使用没有memset()的函数。而且,它按预期工作。我的意思是缓冲区上没有覆盖。让我举例说明,
char str[100];
snprintf(str, sizeof(str), "stackoverflow %zu", sizeof(str));
fprintf(stderr, "%s\n", str);
snprintf(str, sizeof(str), "soner");
fprintf(stderr, "%s\n", str);
到目前为止,我认为代码会打印soneroverflow 100,这就是我使用memset() 的原因。尽管如此,它还是打印了soner。它是如何在引擎盖下完成的?顺便说一句,sprintf() 也是一样的。
【问题讨论】:
-
在调用
sprintf或snprintf之前,您无需对缓冲区进行任何操作。在使用strcpy之前,你也不会打电话给memset,是吗? -
@snr 原因在下面的答案中解释。
-
对于声誉 >3k 并且对 C 标记问题有很多答案的人来说,这是一个奇怪的问题。
-
@Jabberwocky
-
也许你对
strncpy()感到困惑——如果它填满了输出缓冲区,它就不会写入 NUL。