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;
答案 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)
不,由于种种原因,你不能这样分配:
void*
。你的编译器可能
允许这个,但这是未定义的
根据标准的行为[0]
和[1]
,您不需要指针算术
一个void
指针,这是不允许的
无论是。同样在第一个有效的示例中,您可以指定一个指向函数的指针。这是正常的,因为如果你在评估它的地址后没有放()
,那就是一个函数。但在这种情况下,我仍然觉得更清楚地写&f
。