snprintf() 在内部调用 memset() 或类似的吗?
do snprintf() internally call memset() or similar?
为了安全起见,我知道使用 snprintf()
代替 sprintf()
。但是,我总是对 snprintf()
使用的缓冲区执行 memset()
。我看到一些代码使用了没有 memset()
的函数。而且,它按预期工作。我的意思是缓冲区上没有覆盖。让我举例说明,
char str[100];
snprintf(str, sizeof(str), "Whosebug %zu", sizeof(str));
fprintf(stderr, "%s\n", str);
snprintf(str, sizeof(str), "soner");
fprintf(stderr, "%s\n", str);
直到现在,我认为代码会打印 soneroverflow 100
,这就是我使用 memset()
的原因。然而,它打印 soner
。它是如何在引擎盖下完成的?顺便说一句,同样的事情适用于 sprintf()
.
来自snprintf:
A terminating null character is automatically appended after the content written.
如果您要检查缓冲区,您会发现
{ 's', 'o', 'n', 'e', 'r', '[=10=]', 'v', 'e', 'r', /* ... */ }
为了安全起见,我知道使用 snprintf()
代替 sprintf()
。但是,我总是对 snprintf()
使用的缓冲区执行 memset()
。我看到一些代码使用了没有 memset()
的函数。而且,它按预期工作。我的意思是缓冲区上没有覆盖。让我举例说明,
char str[100];
snprintf(str, sizeof(str), "Whosebug %zu", sizeof(str));
fprintf(stderr, "%s\n", str);
snprintf(str, sizeof(str), "soner");
fprintf(stderr, "%s\n", str);
直到现在,我认为代码会打印 soneroverflow 100
,这就是我使用 memset()
的原因。然而,它打印 soner
。它是如何在引擎盖下完成的?顺便说一句,同样的事情适用于 sprintf()
.
来自snprintf:
A terminating null character is automatically appended after the content written.
如果您要检查缓冲区,您会发现
{ 's', 'o', 'n', 'e', 'r', '[=10=]', 'v', 'e', 'r', /* ... */ }