【发布时间】:2014-07-19 16:16:03
【问题描述】:
我对函数指针没有经验,但我认为这是我应该知道的,所以我使用了一个简单的程序。我越来越多地在内核对象领域工作,其中结构和函数指针相当普遍。
这会导致段错误:
int nada(int input){
printf("value = %d", input);
}
typedef struct foo{
void (*funcptr)(int);
}foo;
main()
{
foo* FOO;
FOO->funcptr = nada;
FOO->funcptr(5);
}
但是有一个这样的 main 代替:
main()
{
foo FOO;
FOO.funcptr = nada;
FOO.funcptr(5);
}
不会导致段错误。
另外,我收到一个关于函数指针分配的警告:
main.c:16:17: 警告:来自不兼容指针类型的赋值 [默认启用] FOO.funcptr = nada;
有人解释一下吗?
【问题讨论】:
-
foo* FOO;:它不指向一个对象(foo)。void (*funcptr)(int);类型也不同。 -
以什么方式使用 typedef 而不是简单地声明变量
struct foo FOO会使任何事情更清楚? typedef 非常适合定义复杂的函数指针类型,但对于简单的结构,它们只是混淆了。 -
@WilliamPursell 我只是对一个更复杂且更常用的结构类型进行建模。
-
@aruisdante:我的观点是,通过编写 'struct foo' 显式声明变量类型要清楚得多。打字的最小节省并不能证明额外的晦涩是合理的。这通常是错误的来源,(例如,当 typedef 掩盖了指针类型时)几乎没有什么好处。
标签: c function pointers struct function-pointers