【问题标题】:How to create and call a pointer to a function如何创建和调用指向函数的指针
【发布时间】:2011-11-07 17:27:08
【问题描述】:

您好,我是初学者,我正在尝试找出一些指向函数示例的指针。我什至无法编译我的代码,它显示以下消息。我无法确定为什么会出现编译错误。

/tmp/cc0qghbo.o: In function `main':
pointer_to_function_inside_structure.c:(.text+0x88): undefined reference to `func_ptr'
collect2: ld returned 1 exit status

这是我的代码,请告诉我我做错了什么

#include<stdio.h>
#include<stdlib.h>

struct student_data
{
        char *name;
        int roll_num;
        int marks;
        void (* func_ptr)(struct student_data *ptr);
};

void print_data(struct student_data *ptr);

void print_data(struct student_data *ptr)
{
        printf("\nNAME OF THE STUDENT      %s", ptr -> name);
        printf("\nROLL NUMBER OF STUDENT   %d", ptr -> roll_num);
        printf("\nMARKS OF STUDENT         %d\n", ptr -> marks);
}

int main()
{
        struct student_data *ptr;

        ptr -> name = "ajish";
        ptr -> roll_num = 2;
        ptr -> marks = 50;

        ptr -> func_ptr = &print_data;
        func_ptr(ptr);
}

【问题讨论】:

  • 您的最后一行 func_ptr(ptr) 使用了未声明的变量 func_ptr。你碰巧有一个同名的字段成员,也许你打算ptr-&gt;func_ptr(ptr)

标签: c function function-pointers


【解决方案1】:
  1. 您没有使用指针分配内存。
  2. 由于func_ptrstudent_data 的成员,您必须使用struct student_data *ptr 调用您的函数,它应该是指向您的结构实例的指针。

例子:

int main()
{
    // allocate memory
    struct student_data *ptr = malloc(sizeof(student_data));

    ptr -> name = "ajish";
    ptr -> roll_num = 2;
    ptr -> marks = 50;

    ptr -> func_ptr = &print_data;

    // change this to:
    ptr->func_ptr(ptr);

   // free memory
   free(ptr);
}

【讨论】:

  • +0:虽然这是对的,但它并没有解决编译器错误。
  • @AdamMaras:我已经建议 OP 在我的示例中将 func_ptr(ptr); 更改为 ptr-&gt;func_ptr(ptr);
  • @cpx 抱歉,我没有看到代码示例中的注释。但是您最好在答案的正文中提及为什么该行代码被更改。
  • @kaizer.se VC++ 编译器会在我删除演员表warning C4047: 'initializing' : 'struct student_data*' differs in levels of indirection from 'int' 时发出警告,但在查看此question 之后,我认为通常不需要它。谢谢。
  • C++ 编译器会针对该问题发出警告/标记。无论如何,这并不重要。
【解决方案2】:

您需要将main()的右大括号之前的最后一行从

func_ptr(ptr);

ptr -> func_ptr(ptr);

更改后,程序为我编译并运行。我用 gcc 4.5.0 编译。

你也应该

  1. 在堆上为ptr分配空间

    struct student_data *ptr = malloc(sizeof(struct student_data));
    

    不要忘记在程序结束时释放它:

    free(ptr);
    

    或者

  2. 在堆栈上声明ptr

    struct student_data ptr;
    

    这将要求您将 ptr 上的所有 -&gt; 运算符更改为 . 运算符。

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多