Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:指向结构中函数的指针_C_Pointers_Struct - Fatal编程技术网

C:指向结构中函数的指针

C:指向结构中函数的指针,c,pointers,struct,C,Pointers,Struct,我正在练习用C构建一个结构数据结构,该结构有一个指向函数的字段指针。我已经编写了以下代码,但当我尝试使用gcc编译时,出现了以下错误: 在函数“main”中: custhreadsTest1.c:27:16:警告:来自不兼容指针类型的分配[默认启用] 在我的结构中将函数指针指定给指针字段的正确方法是什么?非常感谢 #include <stdio.h> #include <stdlib.h> #include <ucontext.h> typedef stru

我正在练习用C构建一个结构数据结构,该结构有一个指向函数的字段指针。我已经编写了以下代码,但当我尝试使用gcc编译时,出现了以下错误:

在函数“main”中: custhreadsTest1.c:27:16:警告:来自不兼容指针类型的分配[默认启用]

在我的结构中将函数指针指定给指针字段的正确方法是什么?非常感谢

#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;

}
#包括
#包括
#包括
类型定义结构
{
ucontext\u t(*gt\u context);
void(*函数)(void*);
国际地位标志;
}客户线程;
作废*添加(作废*)
{
//在这里做点什么
}
内部主(空)
{
ucontext\t ctx\u main;
getcontext(&ctx_-main);
custhread_t th1;
th1.gt_context=&ctx_main;
th1.function=&add;
th1.status_flag=1;
返回0;
}

您正在使用正确的语法分配它(
&
是可选的),但是您分配的函数指针类型与结构中的函数指针类型不兼容(您的
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
函数接受并返回一个空指针,那么:

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
}

您正在使用正确的语法对其进行赋值(
&
是可选的),但是您正在赋值的函数指针类型与结构中的函数指针类型不兼容(您的
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
函数接受并返回一个空指针,那么:

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
}

您正在使用正确的语法对其进行赋值(
&
是可选的),但是您正在赋值的函数指针类型与结构中的函数指针类型不兼容(您的
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
函数接受并返回一个空指针,那么:

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
}

您正在使用正确的语法对其进行赋值(
&
是可选的),但是您正在赋值的函数指针类型与结构中的函数指针类型不兼容(您的
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
函数接受并返回一个空指针,那么:

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
}

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

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

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

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

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

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

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

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


您的函数指针被定义为接受一个
void*
,但您分配给它的函数接受
void
。谢谢@ooga。我已经在代码中更新了函数,但仍然是相同的错误。您必须提供一个参数名,例如void*add(void*p1)现在不同的返回类型。现在您的返回类型是错误的。应该是
void
。您的函数指针被定义为使用
void*
,但是您分配给它的函数使用
void
。谢谢@ooga。我已经在代码中更新了函数,但仍然是相同的错误。您必须提供一个参数名,例如void*add(void*p1)现在不同的返回类型。现在您的返回类型是错误的。应该是
void
。您的函数指针被定义为使用
void*
,但是您分配给它的函数使用
void
。谢谢@ooga。我已经在代码中更新了函数,但仍然是相同的错误。您必须提供一个参数名,例如void*add(void*p1)现在不同的返回类型。现在您的返回类型是错误的。应该是
void
。您的函数指针被定义为使用
void*
,但是您分配给它的函数使用
void
。谢谢@ooga。我已经在代码中更新了函数,但仍然是相同的错误。您必须提供一个参数名,例如void*add(void*p1)现在不同的返回类型。现在您的返回类型是错误的。应该是
void
。非常感谢。你的回答对我有用。但是有一个问题是关于你说的“但是你在结构中的函数指针不接受任何参数”。“结构中的函数指针有(void*)作为参数,在这种情况下,(void*)不是参数吗?@TonyGW:是的,如果你在结构中的函数指针有
(void*)
作为参数,然后,您可以将具有
void*
的任何函数的地址指定为参数。要使两种函数类型兼容,它们必须采用相同数量和类型的参数,并返回相同类型的参数。]非常感谢