3

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

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

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

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

行为 2) 段错误

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

最常见的行为是什么?

4

5 回答 5

8

It's undefined behavior - there's nothing to expect. The fact that some implementations check for NULL and replace it with "nil" or "null" is just a nicety, you can't rely on it at all.

于 2012-09-07T11:01:03.970 回答
2

Undefined behaviour. Don't do it.

glibc will use (null) when passing a NULL pointer to %s though, but don't rely on this feature!

于 2012-09-07T11:01:37.560 回答
1

从某种意义上说,没有预期的行为。事实上,标准中明确指出,该行为在相当广泛的意义上是未定义的:它可以工作,它可以发生段错误,它可以格式化你的硬盘等等。你应该NULL自己检查指针。

于 2012-09-07T11:02:40.360 回答
1

此处对其他答案的一个警告:如果第二个参数(指定要写入的字节数)为零,允许将空指针作为第一个参数传递。snprintf

从 C11 标准(强调我的):

snprintf函数等价于fprintf,除了输出写入数组(由参数指定s)而不是流。如果n为零,则不写入任何内容,并且 s 可能是空指针。

这对于首先找出要写入多少字节snprintf以便分配该大小的缓冲区以通过第二次调用写入,这可能很有用snprintf,如https://stackoverflow.com/a/10388547/1709587所示。

但是,如果n为非零,则行为未定义。

于 2019-08-25T13:11:05.317 回答
0

如果我们考虑Opengroup 规范,似乎对于这种情况没有定义的行为:

参数应为指向 char 数组的指针。数组中的字节应写入(但不包括)任何终止的空字节。如果指定了精度,则写入的字节数不得超过该数量。如果精度未指定或大于数组的大小,应用程序应确保数组包含空字节。

于 2012-09-07T11:06:44.607 回答