以下结构中的函数指针“* fun”中包含的值打印错误,我无法找到正确打印的方法。什么是正确的代码?代码:
struct t { //structure definition
int a;
int (*fun) (int a);};
int get_a (int a) { //function definition
a = a*2;
return a;}
int main () {
t test; //variable creation
get_a(5); //function activating
test.fun = &get_a; //assignation to the pointer function
printf ("%d\n",*(test.fun)); //THE NUMBER 4199360 IS WRITTEN INSTEAD OF '10'.
return 0;
}
答案 0 :(得分:2)
您需要将参数值调用为5的函数调用 另外要打印返回值,不要使用*,因为它只是一个int
printf("%d\n", test.fun(5));
答案 1 :(得分:0)
在标题中,您询问是否打印函数指针的值。没有可移植的方法来做到这一点。 printf
格式%p
用于类型为void*
的指针值,但您无法将函数指针可移植地转换为void*
。 (在某些系统上,这样的转换会产生有意义的结果,您可以使用
printf("%p\n", (void*)test.fun);
但这不是严格的便携式。)
但是,您的注释表明您打印的值为10
,这意味着您正在尝试打印,而不是函数指针的值,而是调用函数返回的值。要做到这一点,你必须调用函数:
printf("%d\n", test.fun(5));
请注意,您无需显式取消引用函数指针。函数调用实际上需要函数指针值作为其前缀。最常见的是它是一个隐式转换为指针的函数名。在这种情况下,前缀是一个实际的函数指针,不需要隐式转换。
答案 2 :(得分:0)
#include<stdio.h>
struct t
{
int a;
int *fun;
}test;
int get_a (int a)
{
a = a*2;
return a;
}
int main () {
int c;
c=get_a(5);
test.fun = &c;
printf ("%d\n",*(test.fun));
return 0;
}
这是获得输出的最佳方式,我所做的更改很简单,只需运行程序即可获得输出10
答案 3 :(得分:0)
首先,你应该纠正你应该得到的编译器错误和警告。
t test;
应该是
struct t test;
您还缺少stdio.h
的附加内容。但真正的问题是你相信函数指针以某种方式知道包含它的结构的a
字段。点t.fun只是一个内存地址。该声明告诉编译器期望它是函数take和int的地址并返回一个int。任何时候你期望调用底层函数,你需要传递预期的参数。实际上,您正在打印函数开头编译的任何值,显然不是您想要的。很可能你希望你的主要功能看起来像这样
int main () {
struct t test;
test.a = 5
test.fun = &get_a;
printf ("%d\n",test.fun(test.a));
return 0;
}
调用get_a(5)的orignal行对返回值没有任何作用。