将空指针赋予snprintf时的预期行为

时间:2012-09-07 10:59:44

标签: c++ c pointers printf

此代码段的预期行为是什么?

char * aNullPointer = 0;
snprintf (res, 128, "Testing %s null pointer",aNullPointer);

请注意,我故意试图让它取消引用我的空指针aNullPointer

行为1)res指向字符串“Testing(null)null pointer”

行为2)Seg Fault

根据我的平台,我似乎得到了不同的行为。一些snprintf实现执行完整性检查,而其他实现则不执行。

最常见的行为是什么?

5 个答案:

答案 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不为零,则行为是不确定的。