如何为结构中的函数指针成员赋值

时间:2010-08-20 11:15:20

标签: c pointers function struct

struct a
{
  int (*ptr1)();
  int (*ptr2)();
  int data;
};

typedef struct
{
  struct a x;
}all;

int fun1()
{
  return 5;
};

int fun2()
{
  return 9;
};

我可以指定

all *mem = (all*)malloc(sizeof(all));

mem->x.ptr1 = fun1;
mem->x.ptr2 = fun2;

还有其他方法来分配这些函数指针吗? 可以像这样分配吗?

all *mem;

(void **)mem->ptr1[0] = fun1; 
(void **)mem->ptr2[1] = fun2;

2 个答案:

答案 0 :(得分:5)

不,这是不可能的(我假设您实际上意味着以下内容,因为您的代码没有多大意义)

((void **)&mem->ptr1)[0]=fun1;
((void **)&mem->ptr1)[1]=fun1;

这在语法上是正确的,但引用了C标准:

  

可能有未命名的   在结构对象中填充,但不在其开头。

这意味着您无法保证((void **)&mem->ptr1)+1 == ((void **)&mem->ptr2)

您发布的声明

(void **)mem->ptr1[0] = fun1;

实际上意味着

(void **)((mem->ptr1)[0]) = fun1;

尝试索引函数指针。

请注意,根据您的定义,mem->ptr1等所有引用实际上应为mem->x.ptr1

答案 1 :(得分:1)

不,由于种种原因,你不能这样分配:

  1. 函数指针不兼容 与void*。你的编译器可能 允许这个,但这是未定义的 根据标准的行为
  2. 通过使用[0][1],您不需要指针算术 一个void指针,这是不允许的 无论是。
  3. 同样在第一个有效的示例中,您可以指定一个指向函数的指针。这是正常的,因为如果你在评估它的地址后没有放(),那就是一个函数。但在这种情况下,我仍然觉得更清楚地写&f