繁体   English   中英

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

[英]How can I assign values to a function pointers members in a structure

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;

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

((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->x.ptr1 mem->ptr1等的引用实际上应该是mem->x.ptr1

不,由于多种原因,您不能像这样进行分配:

  1. 函数指针与void*不兼容。 您的编译器可能允许这样做,但这是根据标准的未定义行为
  2. 通过使用[0][1]您不会对void指针进行指针算术运算,这也是不允许的。

同样在第一个可行的示例中,您将指针分配给函数。 就像您所做的一样,这是可以的,因为如果您不将()放在函数的末尾,则该函数将返回其地址。 但是我仍然发现在这种情况下写&f更清晰。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM