此代码段的预期行为是什么?
char * aNullPointer = 0;
snprintf (res, 128, "Testing %s null pointer",aNullPointer);
请注意,我故意试图让它取消引用我的空指针aNullPointer
。
行为1)res
指向字符串“Testing(null)null pointer”
行为2)Seg Fault
根据我的平台,我似乎得到了不同的行为。一些snprintf
实现执行完整性检查,而其他实现则不执行。
最常见的行为是什么?
答案 0 :(得分:7)
这是未定义的行为 - 没有什么可期待的。某些实现检查NULL
并将其替换为“nil”或“null”这一事实只是一个非常好的事情,你完全不能依赖它。
答案 1 :(得分:2)
未定义的行为。不要这样做。
glibc在将NULL指针传递给(null)
时会使用%s
,但不依赖于此功能!
答案 2 :(得分:1)
从某种意义上说,没有预期的行为。实际上,标准中明确指出行为在很广泛的意义上是未定义的:它可以工作,它可以是段错误,它可以格式化你的硬盘等。你应该自己检查NULL
指针。
答案 3 :(得分:0)
如果我们考虑Opengroup specification,似乎这种情况没有明确的行为:
参数应该是指向char数组的指针。数组的字节数应为 写入(但不包括)任何终止空字节。如果精度是 如果指定,则不应写入多个字节。如果精度不是 指定或大于数组的大小,应用程序应确保 数组包含一个空字节。
答案 4 :(得分:0)
一个警告,这里的其他答案: 允许将空指针作为第一个参数传递给snprintf
if 的第二个参数(指定要写入的字节数)为零。
根据C11标准(强调我):
snprintf
函数等效于fprintf
,除了将输出写到数组(由参数s
指定)而不是流中。 如果n
为零,则不会写入任何内容,并且s可能为空指针。
这对于首先找出要写入多少字节snprintf
以便分配该大小的缓冲区以便第二次调用snprintf
来写入将很有用,如{{ 3}}。
但是,如果n
不为零,则行为是不确定的。