[英]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
。
不,由于多种原因,您不能像这样进行分配:
void*
不兼容。 您的编译器可能允许这样做,但这是根据标准的未定义行为 [0]
和[1]
您不会对void
指针进行指针算术运算,这也是不允许的。 同样在第一个可行的示例中,您将指针分配给函数。 就像您所做的一样,这是可以的,因为如果您不将()
放在函数的末尾,则该函数将返回其地址。 但是我仍然发现在这种情况下写&f
更清晰。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.