+ -
当前位置:首页 → 问答吧 → 内核中的函数指针

内核中的函数指针

时间:2004-11-18

来源:互联网

我记得在标准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 到底是什么关系,是不是完全相同呢?

作者: cxh_nuaa_2001   发布时间: 2004-11-18

对于数组名也一样,如
int arr[10];

arr 和 &arr的结果也一样的。

作者: cxh_nuaa_2001   发布时间: 2004-11-18

C 中的函数名和数组名都是常量,用上& 和不用本来就是一样的,这只取决于个人习惯问题,
个人习惯还包括代码对齐等,在[Documentation/CodingStyle] 中规定了很多,但却没规定这个问题, :-)

作者: crquan   发布时间: 2004-11-18

这里的max和&max是等价的

作者: seablue   发布时间: 2004-11-20

热门下载

更多