QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1256|回复: 3

内核中的函数指针

[复制链接]
发表于 2004-11-18 15:02:15 | 显示全部楼层 |阅读模式
我记得在标准C中,数组名和函数名都代表相应的入口地址。但是在linux内核中有这么一段代码我不明白。

asmlinkage void divide_error(void);
。。。
set_trap_gate(0,&divide_error);

既然函数名 divide_error 就代表了函数的入口地址,那么在

set_trap_gate(...)的参数中为什么还要用

&divide_error 呢? 在这里直接用 divide_error 不可以吗?

请高手指明!

ps:
我做了一个实验:

#include <stdio.h>

void max(void)
{
printf("ok\n");
}

void main(void)
{
void (*p)(void);
p = max;
(*p)();
p = &max;
(*p)();
printf("%p, %p\n", max, &max);
}

结果编译正常通过,得到结果如下(不同的机子可能不同):

ok
ok
01FA, 01FA

为什么会出现这种情况呢?
max 和 &max 到底是什么关系,是不是完全相同呢?
发表于 2004-11-20 13:40:00 | 显示全部楼层
C 的函数名,就是地址,函数名取地址,还是一样
所以p() ,(*p)() 都可以调用函数
回复

使用道具 举报

发表于 2004-11-23 14:33:56 | 显示全部楼层
回复

使用道具 举报

发表于 2004-12-29 16:35:08 | 显示全部楼层
对头, C语言中的函数指针就是这样
(*p)(var1, var2) 和p(var1, var2)的行为一样
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 06:58 , Processed in 0.037849 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表