野(函数)指针

2009年2月22日 06:09

本来这个问题可以归为指针的一部分,野指针的管理和注意应该更加是必要的基础。

但野(函数)指针在嵌入式系统中还真是不多见,至少俺不那么多见。

简单说一下原理:

 

typedef int (* function)(int);

function类型的指针就可以指向:返回值为int类型,参数为int类型的函数;

例如:

 

#include <stdio.h>
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上的虚拟内存的管理机制,用到的模块在运行时会被载入内存,在不用时就会从内存中移除。这样如果静态编译的模块通过函数指针调用动态模块中的注册函数的话,那就会。。。。。。

这种问题出现恶心的很。。 

被Greader BS了。

2009年2月12日 07:05

居然被认为是残障人士了?

才知道Greader支持ARIA呢。。不过还真是没有啥体会。。:)

 

palm软件推荐

2009年2月10日 06:41

用了这么久的palm(5年多),居然没用过Resco Photo Viewer,实在不能说不是失败的。

 

昨天逛坛子无意中发现有人发XX,引起俺的兴趣,找来一看,俺一般300W的PP也能顺利浏览而且速度飞快,特别是幻灯片浏览功能,裁剪功能。非常不错,可以在卡中运行。没有出现死机问题。非常不错!

找几个图片看看(官方网站也有):

 

 

想共享么?没问题:

欢迎大家使用交流。:)