Chinaunix首页 | 论坛 | 博客
  • 博客访问: 537024
  • 博文数量: 70
  • 博客积分: 3162
  • 博客等级: 中校
  • 技术积分: 850
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-23 13:30
文章分类
文章存档

2013年(1)

2012年(4)

2011年(1)

2010年(7)

2009年(9)

2008年(20)

2007年(3)

2006年(25)

分类: LINUX

2006-04-13 11:04:21

    近期看mplayer的代码,跟踪一个变量的使用的时候,突然发现是取得一函数的返回值而引起变化,立即去查找这个函数的具体实现代码,结果grep整个代码树也没有找到该函数的具体实现代码,只好静下心一步一步看代码是怎么走的:
typedef struct demuxers_desc_st {
    ...
  int (*check_file)(struct demuxer_st *demuxer);//假设这里的下标是10
    ...
} demuxer_desc_t;
demuxer_desc_t* demuxer_list[] = {
    ...
  &demuxer_desc_rawaudio,
  &demuxer_desc_rawvideo,
  &demuxer_desc_tv,
    &demuxer_desc_mpeg_ps,
  NULL
};
demuxer_desc_t demuxer_desc_mpeg_ps = {
   ...
  demux_mpg_probe,
   ...
};
static demuxer_desc_t* get_demuxer_desc_from_type(int file_format)
{
    ...
      return demuxer_list[i];
}
demuxer_desc_t *demuxer_desc;
demuxer_desc = get_demuxer_desc_from_type(file_format));

fformat = demuxer_desc->check_file(demuxer);

这里的check_file()就是我前面提到的找不到具体实现的函数,首先知道我们它是一函数指针,现在来分析它最后到底指向谁:
1) check_file()是结构体demuxer_desc的一个成员函数,在上面的代码里我们假设其下标是10;
2) 结构体demuxer_desc是通过调用函数get_demuxer_desc_from_type()来填充的,而get_demuxer_desc_from_type()的返回值是demuxer_list[i],这里的具体值是&demuxer_desc_mpeg_ps,所以demuxer_desc的成员函数也就是demuxer_desc_mpeg_ps的成员函数,进而知道demuxer_desc的第10个成员和demuxer_desc_mpeg_ps的第10个成员应该是一一对应的,而demuxer_desc_mpeg_ps的第10个成员是demux_mpg_probe,所以check_file最后指向的就是demux_mpg_probe,就这样明目张胆地被偷天换日了:(
阅读(1563) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~