我正在练习在C中构建一个struct数据结构,struct有一个指向函数的字段指针。我写了下面的代码,但是当我尝试用gcc编译时,我收到了以下错误:
在功能'main'中: custhreadsTest1.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;
}
答案 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;