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);
答案 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刻意避免指定float
和double
的表示方式:
6.2.6.1常规
- 除本节中所述的以外,所有类型的表示形式均未指定。
因此,您不能保证calloc
会产生0.0个值。
另一方面,无符号整数的表示方式指定如下:
如果有N个值位,则每个位应代表一个不同的值 2的幂在1和2 N-1 之间,因此该类型的对象应能够使用纯二进制表示形式表示从0到2 N -1 的值。
因此,保证calloc
-ed unsugned int
的值为零。