今天在调试程序时发现个问题:
printf(DouToStr(-20.01)) //可以输出字符:-20.01
KeyInit("-20.01", -100, 2000, DispId, "%s") //可以正常工作,
但:
KeyInit(DouToStr(-20.01), -100, 2000, DispId, "%s") //工作异常,表现为-20.01没带入KeyInit函数。
仔细看后发现是DouToStr函数错误:
S8 *DouToStr(double Dou)
{
S8 Str[StrMax+3]; //问题就出在这。
....
return Str;
}
Str数组是在函数DouToStr被调用时在栈中建立的,在DouToStr返回时已经被回收,就是说在DouToStr返回后Str理论上已经不存在了,随时会被改写。
但在没有别的程序改变栈的内容时,Str依旧可以读到正确的值。所以才有printf输出正确。
在KeyInit调用时,因参数传递的较多,已经覆盖了原Str的部分内容,导致工作异常。 |