双字段的calloc()是否总是求值为0.0?

时间:2018-12-14 16:03:22

标签: c floating-point int double calloc

  • 双字段的calloc()是否始终等于0.0

此外

  • calloc()字段中的float是否始终等于0.0f
  • calloc()int字段中的unsigned int始终等于0吗?

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

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

4 个答案:

答案 0 :(得分:5)

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

碰巧,这也是0.0的有效IEEE754(这是计算机上浮点值的最常见格式)表示形式。

IIRC没有C规范的任何部分要求实现使用IEEE754,因此请注意,它不是可移植的。但是实际上是这样(如果您要在非IEEE754系统上工作,那么您应该已经积累了足够的经验,已经知道了这一点以及如何解决此类问题)。

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

答案 1 :(得分:5)

C11文档中有关于calloc

的明确声明
  

脚注

     

296)请注意,这不必与   浮点零或空指针常量。

实际上,所有零位在主要平台上都是0.0或null指针的(或)表示形式,在IEEE 754上为true。

答案 2 :(得分:1)

float的所有字节均为零并不表示0.0。来自here

  

初始化为所有零位并不能保证将浮点或指针分别初始化为0.0和空指针值(尽管在所有常见平台上都是如此)

答案 3 :(得分:1)

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

  

6.2.6.1常规

     
      
  1. 除本节中所述的以外,所有类型的表示形式均未指定。
  2.   

因此,您不能保证calloc会产生0.0个值。

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

  

如果有N个值位,则每个位应代表一个不同的值   2的幂在1和2 N-1 之间,因此该类型的对象应能够使用纯二进制表示形式表示从0到2 N -1 的值。

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