vsnprintf
在输入NULL字符串和/或size = 0时的预期行为是什么,例如
vsnprintf(NULL, 0, "%d", p);
或
vsnprintf(NULL, 10, "%d", p);
是未定义的行为还是有效的情况?它不会因输入字符串NULL
和长度0
而崩溃,并返回-1(对于有效的非NULL字符串和零长度相同),但它会以相反的方式崩溃around(NULL
输入字符串和正长度)。
答案 0 :(得分:4)
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
不为零,因此您违反了约束,并且您获得了未定义的行为。无论哪种方式,您都可能写入deference一个NULL指针,这又是未定义的行为。如果你很幸运你的程序崩溃了。如果你不这样做,它会继续运行并为你的程序做些奇怪的事情。
答案 1 :(得分:2)
引用C11
,章节§7.21.6.12, vsnprintf
功能
vsnprintf
函数等效于snprintf
,带有变量参数列表 由arg
替换,va_start
已由va_arg
宏初始化(和 可能是后续snprintf()
次来电。 [....]
然后,对于n
,§7.21.6.5
[...]如果
s
为零,则不写任何内容,NULL
可能是空指针。
因此,您定义了第一个案例ID,而第二个案例ID通过尝试访问无效(<div id="inside_content">
</div>
)指针来调用undefined behavior。