将 NULL 传递给 modf()、modff() 或 modfl() 是否安全?

Is it safe to pass NULL to modf(), modff(), or modfl()?

这些函数是将浮点数拆分为整数部分和小数部分。如果我不想写整数部分,将 NULL 传递给第二个参数是否安全?

安全。 C 标准没有提及该参数允许 NULL。

事实上,尝试将第二个参数设置为 NULL 会导致 CentOS 7 出现段错误。

C 2018 7.12.6.12 2 说“……它们将整数部分(以浮点格式)存储在 iptr 指向的对象中。” iptr 为 null 没有例外,因此我们可以得出结论,iptr 必须指向一个对象(不能为 null)。

此外,可选的附件 F 说“modf 表现得好像由以下人员实施”:

#include <math.h>
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
double modf(double value, double *iptr) {
    int save_round = fegetround();
    fesetround(FE_TOWARDZERO);
    *iptr = nearbyint(value);
    fesetround(save_round);
    return copysign(
        isinf(value) ? 0.0:
            value - (*iptr), value);
}

这里我们看到 *ptr 的显式存储,没有检查 null。这是针对当实现支持附件 F(IEC 60559 浮点运算,有效的 IEEE 754)时,但它证实了上述对 7.12.6.12 的解释,因为如果 modf 仅在附件时才允许空参数,那将是奇怪的F没有被采纳