将 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没有被采纳
这些函数是将浮点数拆分为整数部分和小数部分。如果我不想写整数部分,将 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没有被采纳