C:指向Struct中函数的指针

时间:2014-02-04 23:33:35

标签: c pointers struct

我正在练习在C中构建一个struct数据结构,struct有一个指向函数的字段指针。我写了下面的代码,但是当我尝试用gcc编译时,我收到了以下错误:

在功能'main'中: custhreadsT​​est1.c:27:16:警告:从不兼容的指针类型分配[默认启用]

什么是在我的struct中为函数指针指定指针字段的正确方法?非常感谢!

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

typedef struct
{
  ucontext_t (*gt_context);
  void (*function)(void *);
  int status_flag;
} custhread_t;

void *add(void *)
{
//  do something here
}

int main(void)
{
  ucontext_t ctx_main;
  getcontext(&ctx_main);

  custhread_t th1;
  th1.gt_context = &ctx_main;
  th1.function = &add;
  th1.status_flag = 1;

  return 0;

}

2 个答案:

答案 0 :(得分:2)

您使用正确的语法分配它(&是可选的),但您分配的函数指针类型与结构中的函数指针类型不兼容(您的add函数取void *,但结构中的函数指针不带任何参数。)

您的add功能应该只是:

void add(void)
{
    // do something
}

或者,如果您的add函数 将指向void的指针作为参数,那么:

typedef struct
{
    ucontext_t (*gt_context);
    // pointer to a function that takes a void pointer, no return value
    void (*function)(void *); 
    int status_flag;
} custhread_t;


void add(void *somePointer)
{
    // do something with somePointer
}

因此,如果您的add函数接受并返回一个void指针,那么:

typedef struct
{
    ucontext_t (*gt_context);
    // pointer to a function that takes and returns a void pointer
    void *(*function)(void *);
    int status_flag;
} custhread_t;


void *add(void *somePointer)
{
    // do something with somePointer
    // return a void pointer
}

答案 1 :(得分:1)

你做得对。只需确保函数指针类型匹配即可。例如,删除&#39; *&#39;从结构中,参数只是void而不是void指针。像这样。

typedef struct
{
    ucontext_t (*gt_context);
    void (*function)(void);
    int status_flag;
} custhread_t;