snprintf() 是不是在内部调用 memset() 或类似的?
Posted
技术标签:
【中文标题】snprintf() 是不是在内部调用 memset() 或类似的?【英文标题】:do snprintf() internally call memset() or similar?snprintf() 是否在内部调用 memset() 或类似的? 【发布时间】:2018-06-20 08:05:28 【问题描述】:为了安全起见,我知道使用 snprintf()
代替 sprintf()
。但是,我总是对snprintf()
使用的缓冲区执行memset()
。我看到一些代码使用没有memset()
的函数。而且,它按预期工作。我的意思是缓冲区上没有覆盖。让我举例说明,
char str[100];
snprintf(str, sizeof(str), "*** %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。
【参考方案1】:
来自snprintf:
在写入内容后会自动附加一个终止空字符。
如果你要检查缓冲区,你会发现
's', 'o', 'n', 'e', 'r', '\0', 'v', 'e', 'r', /* ... */
【讨论】:
@snr sprintf doesn't put null terminator:如果是这种情况,那么要么您的sprintf
实现被破坏,要么您的程序事先做了坏事导致未定义的行为。请编辑您的问题并发布minimal reproducible example。
@Jabberwocky 这是因为我缺乏知识,sprintf 也是空终止的。
@snr sprintf
和 snprintf
非常相似,都是 NUL
终止字符串。以上是关于snprintf() 是不是在内部调用 memset() 或类似的?的主要内容,如果未能解决你的问题,请参考以下文章
Spark 程序在内部调用 HDFS:/apps/hive/warehouse
useAuthState() 是不是每次都使用 cookie 或请求?它在内部如何运作?