野(函数)指针
2009年2月22日 06:09
本来这个问题可以归为指针的一部分,野指针的管理和注意应该更加是必要的基础。
但野(函数)指针在嵌入式系统中还真是不多见,至少俺不那么多见。
简单说一下原理:
function类型的指针就可以指向:返回值为int类型,参数为int类型的函数;
例如:
typedef int (* function)(int);
static int printHex(int para)
{
printf("para = [%x]\r\n", para);
return 0;
}
int main(void)
{
function p = printHex;
p(10);
return 0;
}
这是一段很简陋的代码,简单演示一下函数指针如何使用。实际情况中,往往p是A模块作为一个参数传递给B模块,在B模块中调用p(10),也就是常说的回调机制。
在一般情况下,printHex这个函数都是被分配在一个固定地址,尽管它会被static类的修饰来决定访问权限;但无论如何它在整个代码的生命周期中是存在的,即一般不会碰到p指针成为野指针的情况。但是要注意,如果printHex如果是在一个动态模块中,例如前面说到A模块中实现的printfHex,然后通过一个指针传给B,但在B执行之前,A模块就由于某种机制释放掉了。这个时候B中的指针就成为野指针。如果再次访存就会导致SIGSEGV.
一般的系统似乎都不会有这种问题,但在BREW平台上就会有。 BREW平台提供动态编译机制,来达到节省内存的目的。很类似PC上的虚拟内存的管理机制,用到的模块在运行时会被载入内存,在不用时就会从内存中移除。这样如果静态编译的模块通过函数指针调用动态模块中的注册函数的话,那就会。。。。。。
这种问题出现恶心的很。。