双字段的 calloc() 是否总是计算为 0.0?

Does calloc() of a double field always evaluate to 0.0?

此外

也就是,下面的assert()在所有平台上都会成功吗?

double* d = calloc(1, sizeof(double));
assert(*d == 0.0);
free(d);

calloc 将已分配内存的所有字节设置为零。

碰巧,这也是 0.0.

的有效 IEEE754(这是计算机上浮点值最常见的格式)表示

IIRC C 规范中没有任何部分需要使用 IEEE754 的实现,所以挑剔一点,它不可移植。但实际上,它是(如果你打算在非 IEEE754 系统上工作,那么你应该已经积累了足够的经验来了解这一点以及如何解决此类问题)。

另请注意,这对指针也有效。在您可能接触到的所有系统上,空指针应该等于 0。但可能有些系统没有,但如果你在这样的系统上工作,你应该已经知道它了(如果你使用 NULL 那么它应该不是问题)。

float 的所有字节都为零并不意味着 0.0。来自 here

Initialization to all bits zero does not guarantee that a floating-point or a pointer would be initialized to 0.0 and the null pointer value, respectively (although that is true on all common platforms)

C11 文档有针对 calloc

的明确通知

Footnotes

  1. Note that this need not be the same as the representation of floating-point zero or a null pointer constant.

实际上,所有零位都是 0.0 在所有主要平台上的(或)表示,因为它们使用 IEEE 754 表示。是的,这将适用于 Intel、ARM、Linux、Windows、Mac、Raspberry PI 智能手机。

C standard 故意避免指定 floatdouble 的表示方式:

6.2.6.1 General

  1. The representations of all types are unspecified except as stated in this subclause.

因此,您无法保证 calloc 会产生 0.0 值。

另一方面,无符号整数的表示指定如下:

If there are N value bits, each bit shall represent a different power of 2 between 1 and 2N−1, so that objects of that type shall be capable of representing values from 0 to 2N − 1 using a pure binary representation.

因此,calloc-ed unsugned int的值保证为零。