当输入NULL字符串和/或大小为0时,vsnprintf
的预期行为是什么,例如
vsnprintf(NULL, 0, "%d", p);
或
vsnprintf(NULL, 10, "%d", p);
这是未定义的行为还是有效的场景?它不会在输入字符串为NULL
和长度为0
的情况下崩溃,并返回-1(对于有效的非NULL字符串和零长度也是如此),但它确实会以另一种方式崩溃(NULL
输入字符串和正长度)。
vsnprintf(NULL, 0, "%d", p);
实际上是定义的行为。
7.19.6.5/2
snprintf
函数等效于fprintf
,只是输出被写入数组(由参数s
指定)而不是流。如果n为零,则不写入任何内容,并且s
可以是空指针。。。7.19.6.12/2
vsnprintf
功能等同于snprintf
。。。
vsnprintf(NULL, 10, "%d", p);
不是。由于n
不为零,您违反了一个约束,得到了未定义的行为。无论哪种方式,您都可能编写一个NULL指针来表示尊重,这也是未定义的行为。如果幸运的话,你的程序会崩溃。如果你没有,它会继续运行,并对你的程序做一些奇怪的事情。
引用C11,第7.21.6.12章,vsnprintf
函数
vsnprintf
函数等效于snprintf
,具有变量参数列表由va_start
宏(以及可能的后续va_arg
调用)已经初始化的arg
代替。[….]
然后,对于snprintf()
,§7.21.6.5
[…]如果
n
为零,则不写入任何内容,并且s
可以是空指针。
因此,定义了第一种情况,而第二种情况通过尝试访问无效(NULL
)指针来调用未定义的行为。