如何从结构中打印函数指针的值

时间:2016-06-21 15:56:46

标签: c

以下结构中的函数指针“* 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;
}

4 个答案:

答案 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行对返回值没有任何作用。