嵌入式开发中局部变量被覆盖问题
作者: jordan.sg 时间20100115 QQ :742980934 email:zzsg2005@126.com
欢迎转载,必须注明出处。
最近,在手机开发中,发现一个有趣的问题---局部变量被覆盖,即使动态申请也会被覆盖。
在一个函数中,形如:
void fun(void)
{
char a[20];
char b[162];
//--------------
memset(b,0,(sizeof(char)*b));
strcpy(b,"KKKKKKKKKKKKKKKKKKKKKK") ;
.....
fun2(); 发现这里函数调用后,b的内容被覆盖;
}
b是申请在 stack 上的,fun2调用也会使用stack。如果b被覆盖,证明stack已经不够用了。
于是修改函数,采用动态申请方式给b分配空间。代码就不写了。测试结果是也会被覆盖。
从系统自由空间申请和多媒体空间申请也是一样。
由于没分析源码,不了解具体空间管理机制,不能对这种现象下结论。
看来,既然函数调用会使用stack 空间,那么要解决此问题,只有减少 stack的使用。
故,不调用 fun2,而使用等价于fun2的底层函数。目的是使调用函数减少到最少。
经测试,问题解决。
嵌入式系统开发中经常会遇到空间不足的问题,所以我们写的代码也要经常检查执行成功失败,准备好失败处理。
而今天这个局部变量被覆盖问题,也是在编译和运行期都不容易发现的问题。逐步跟踪内存才能发现。这种问题的出现
从而说明了编写高效代码的必要性。可读性就不是那么重要了。这一点和在PC上编程有很大的区别。
作者: jordan.sg 时间20100115 欢迎转载,必须注明出处。