我在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
。
我的问题很简单:为什么一个有效但另一个无效?
答案 0 :(得分:0)
数组中char
太多。
lexeme
是一个20字符的数组,但它填充了999999999999...999999999999.0
或0.000...00000000000000000000001
。这会覆盖控制谁知道什么的内存。在任何一种情况下,这都会调用未定义的行为,并且检查其余代码是徒劳的。 OP报告事情按预期工作,1.9999999999999999111111111....11111111
不会验证它是否会再次起作用。
确保lexeme
的填充不超过19 char
(char
留下1 '\0'
。