为什么在此上下文中使用LONG_MAX可行,但使用FLT_MAX不起作用?

时间:2014-10-29 00:28:38

标签: c arrays string floating-point

我在Windows 8.1上使用MS Visual Studio 2012在ANSI C中编写了一个函数,该函数接受一个char数组lexeme,其空间为20 chars并检查有效的单精度浮点数。

我的功能:

Token aa_func08(char lexeme[]){
    Token t; /* floating point literal Token to be returned */
    double temp; /* floating point value of character array */

    temp = atof(lexeme); /* convert character array to floating point value */
    if (strlen(lexeme) > ERR_LEN && (temp > LONG_MAX || temp < FLT_MIN)) /* floating point value is outside the accepted range */
        return aa_table[ES](lexeme); /* return an error Token */
    t.code = FPL_T; /* set Token code */
    t.attribute.flt_value = (float)temp; /* set Token integer value to floating point literal value */
    return t; /* return floating point literal Token */
}

正如此处所提供的,该功能按预期工作,但如果我将LONG_MAX更改为FLT_MAX,则该功能不再符合我的预期。

我测试的输入:

1.999999999999999911111111111111111111111111111111111111111111111111111111111111111

以上内容应生成2.000000的输出,我将flt_value保存为float

999999999999999999999999999999999999999999999999999999999999999999999999999999999.0

0.00000000000000000000000000000000000000000000000000000000000000000000000000000000001

上述内容应触发行return aa_table[ES](lexeme);以产生错误Token

我的问题很简单:为什么一个有效但另一个无效?

1 个答案:

答案 0 :(得分:0)

数组中char太多。

lexeme是一个20字符的数组,但它填充了999999999999...999999999999.00.000...00000000000000000000001。这会覆盖控制谁知道什么的内存。在任何一种情况下,这都会调用未定义的行为,并且检查其余代码是徒劳的。 OP报告事情按预期工作,1.9999999999999999111111111....11111111不会验证它是否会再次起作用。

确保lexeme的填充不超过19 charchar留下1 '\0'