当前位置:  技术问答>linux和unix

搞了一年多的c了,第一次看见这样的代码!!!!

    来源: 互联网  发布时间:2017-02-15

    本文导语:  下面是linux内核中的一段代码, 我看了半天不明白是什么意思,之前从来没有见过这样调用的,哪位高手能帮忙解释一下下面四行代码究竟是什么意思啊? struct ecryptfs_key_mod_ops *(*get_key_mod_ops)(void); get_key_mod_ops = (...

下面是linux内核中的一段代码, 我看了半天不明白是什么意思,之前从来没有见过这样调用的,哪位高手能帮忙解释一下下面四行代码究竟是什么意思啊?

struct ecryptfs_key_mod_ops *(*get_key_mod_ops)(void);
get_key_mod_ops = (struct ecryptfs_key_mod_ops *(*)(void)) dlsym(handle, "get_key_mod_ops");

struct ecryptfs_key_mod_ops *(*walker)(void);
walker = builtin_get_key_mod_ops[i];



ecryptfs_key_mod_ops和builtin_get_key_mod_ops的定义如下:
struct ecryptfs_key_mod_ops {
int (*init)(char **alias);
int (*get_gen_key_params)(struct key_mod_param **params,
  uint32_t *num_params);
int (*get_gen_key_subgraph_trans_node)(struct transition_node **trans,
       uint32_t version);
int (*get_params)(struct key_mod_param **params, uint32_t *num_params);
int (*get_param_subgraph_trans_node)(struct transition_node **trans,
     uint32_t version);
int (*get_blob)(unsigned char *blob, size_t *blob_size,
struct key_mod_param_val *param_vals,
uint32_t num_param_vals);
int (*get_key_data)(unsigned char *key_data, size_t *key_data_len,
    unsigned char *blob);
int (*get_key_sig)(unsigned char *sig, unsigned char *blob);
int (*get_key_hint)(unsigned char *hint, size_t *hint_len,
    unsigned char *blob);
int (*encrypt)(char *to, size_t *to_size, char *from, size_t from_size,
       unsigned char *blob, int blob_type);
int (*decrypt)(char *to, size_t *to_size, char *from, size_t from_size,
       unsigned char *blob, int blob_type);
int (*destroy)(unsigned char *blob);
int (*finalize)(void);
};

static struct ecryptfs_key_mod_ops *      //这个定义是傻意思啊?也请高手帮忙解答一下噢
(*builtin_get_key_mod_ops[])(void) = {
&passphrase_get_key_mod_ops,
NULL
};

|
四行中的前两行:定义函数指针,把dlsym的返回值强制转换为同类型函数赋给该函数指针。
后两行:定义函数指针,并为该函数指针赋值。
下面代码中:定义一个函数指针数组,数组的每个元素就是一个函数地址。
好复杂 
上Demo code:

#include 

int add(int a, int b)
{
return a + b;
}

int sub(int a, int b)
{
return a - b;
}

/* its return value is a function pointer */
int (*fun_p(void))(int, int)
{
return add;
}

int main(void)
{
int (*calc)(int, int); /* function pointer */
int (*fun_p_arr[2])(int, int) = { &add, &sub }; /* function pointer array, just like the last five-lines code */

int a = 3, b = 4;

calc = fun_p(); /* just like the first two line of your four-lines code */
printf("Add: %dn", calc(a, b));

calc = fun_p_arr[1]; /* just like the last two line of your four-lines code */
printf("Sub: %dn", calc(a, b));

return 0;
}

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 我在JB中编写Servlet,为什么在第一次请求时,其会再调用init()?
  • 如何让用户第一次登录时必须更改密码?
  • 求助!第一次使用gdb,出问题不懂怎么解决
  • 第一次起qt的程序,很慢,谁知道是什么原因么?
  • 在第一次使用kde时设置中文,怎样再改回英文?
  • 第一次安装solaris需要注意什么
  • 第一次装linux遇到的问题
  • 求助,firefox安装flash的问题,第一次发贴
  • 为什么linux下第一次查找慢些?
  • php开源软件 iis7站长之家
  • 第一次弄LINUX,关于CRONTAB的!在线求助!!
  • sed 替换指定行的匹配字符串,第一次发帖。
  • jsp调用EJB,第一次能查询记录,以后怎不行拉?
  • 求助:第一次装apache+php,运行站点出现403错误!
  • applet将他嵌入到一个网页中,第一次运行结果显示都正确,可是.....
  • 我装好红旗LINUX了,第一次启动出现localhost login:,请问应该输入什么
  • 我第一次来,怎么送分数阿
  • 第一次来这里散分。
  • 第一次用Linux,有小问题要问
  • 第一次进java论坛,希望能够得到大家的帮助,以后多多指教。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3