程序跑飞了,求分析

C、C++和Java语言
回复
头像
Jarson
帖子: 2371
注册时间: 2008-07-21 9:44
来自: 深圳
送出感谢: 0
接收感谢: 0
联系:

程序跑飞了,求分析

#1

帖子 Jarson » 2010-11-09 21:38

程序代码(片段):
[c]
typedef void (* api_msg_decode)(struct api_msg_msg *msg); /* api_msg_decode定义为指向函数的指针类型 */
static api_msg_decode decode[API_MSG_MAX] = { /* decode为api_msg_decode类型数组,其成员为相应的函数指针 */
do_newconn,
do_delconn,
do_bind,
do_connect,
do_disconnect,
do_listen,
do_accept,
do_send,
do_recv,
do_write,
do_close,
};


static void
do_consol_print(struct api_msg_msg *msg)
{
int i = 0;
CONSOL_Printf("msg = %x\n",msg);
for (; i < API_MSG_MAX; i++)
{
CONSOL_Printf("decode[%d] = %x\n", i, decode);
}
CONSOL_Printf("do_newconn = %x\n"
"do_delconn = %x\n"
"do_bind = %x\n"
"do_connect = %x\n"
"do_disconnect = %x\n"
"do_listen = %x\n"
"do_accept = %x\n"
"do_send = %x\n"
"do_recv = %x\n"
"do_write = %x\n"
"do_close = %x\n",
do_newconn, do_delconn, do_bind, do_connect, do_disconnect,
do_listen, do_accept, do_send, do_recv, do_write, do_close);
CONSOL_Printf("do_consol_print = %x\n", do_consol_print);
}

[/c]

程序执行结果:

[c]
msg = 30008cb0

decode[0] = 200c1a

decode[1] = 300c1a

decode[2] = 400c1a

decode[3] = 500c1a

decode[4] = 600c1a

decode[5] = 700c1a

decode[6] = 800c1a

decode[7] = 900c1a

decode[8] = a00c1a

decode[9] = b00c1a

decode[10] = c00c1a

do_newconn = d3c0

do_delconn = d548

do_bind = d694

do_connect = d808

do_disconnect = d9c0

do_listen = da0c

do_accept = dab4

do_send = dacc

do_recv = db24

do_write = db64

do_close = dc40

do_consol_print = dc98
[/c]

程序在ADS1.2中编译生成,在32位ARM平台上运行。
问题是:为什么decode[0]的值不等于do_newconn函数指针?
即不能通过decode[0](msg);来实现do_newconn(msg);函数调用。其中msg是struct api_msg_msg *类型,do_newconn的函数原型是[c]static void do_newconn(struct api_msg_msg *msg);[/c]其后的do_*函数类推。这些函数及数据结构在同一个文件中定义。
头像
Jarson
帖子: 2371
注册时间: 2008-07-21 9:44
来自: 深圳
送出感谢: 0
接收感谢: 0
联系:

Re: 程序跑飞了,求分析

#2

帖子 Jarson » 2010-11-11 8:52

自己顶一下 :em11
回复

回到 “C/C++/Java”