[英]How to apply the sizeof operator to a function pointer and initialize a structure?
后面的代码会产生错误:在声明和初始化用户struct变量的行上, 初始化器元素在编译时不是恒定的 。
#include <stdio.h>
#include <stdlib.h>
struct user_s {
char *name;
void (*(*pred_skip_func))(int);
};
void f1 (int skip) {
printf("I am f1\n");
}
void f2 (int skip) {
printf("I am f2\n");
}
void (*(*pred_skip_func))(int);
struct user_s user = {"Manu", pred_skip_func};
int main(void) {
struct user_s tmp;
pred_skip_func = malloc(sizeof(tmp.pred_skip_func) * 2);
pred_skip_func[0] = f1;
pred_skip_func[1] = f2;
int i;
for (i = 0; i < 2; i++) {
(*(user.pred_skip_func)[i]) (i);
}
return EXIT_SUCCESS;
}
在主函数中移动初始化可以解决此问题,但是我想了解为什么? 结构初始化有任何限制吗?
而且,如您所见,我创建了一个tmp user_struc变量来获取函数指针的大小,因为我无法以一种更简洁的方式来做到这一点。 我怎样才能解决这个问题 ?
第一个问题:
“结构初始化是否有任何限制?”
C要求静态存储持续时间恒定的聚合类型的初始化程序是恒定的:
(C99,6.7.8p4)“具有静态存储持续时间的对象的初始化程序中的所有表达式应为常量表达式或字符串文字。”
请注意,在C89中,即使聚合类型的对象具有自动存储时间,初始化器也必须是常量表达式(在C99中不再是这种情况)。
第二个问题:
“此外,如您所见,我创建了一个tmp user_struc变量来获取指向函数指针的指针的大小,因为我无法以更简洁的方式做到这一点。”
您可以使用您的user
对象来计算成员的大小:
sizeof (user.pred_skip_func)
或使用C99复合文字,如果您尚未声明任何结构类型的对象:
sizeof (((struct user_s) {0}).pred_skip_func)
正如@ouah所指出的那样,问题在于pred_skip_func
不是恒定值。 编译器抱怨,因为user
具有静态存储持续时间,这意味着其按位表示将在链接时“放入”可执行映像中。 为了使链接器知道此表示, pred_skip_func
的值必须为常数。
但是,您可以非常轻松地为struct成员指定“合理的默认”常量值:
struct user_s user = {"Manu", 0};
您可以为函数指针使用typedefs
,如下所示。
typedef void (*pfunc_type)(int);
struct user_s
{
char *name;
pfunc_type *pred_skip_func;
};
.....
int main (void)
{
.....
pred_skip_func = (pfunc_type *)malloc(sizeof(pfunc_type) * 2);
.....
}
这将增加程序的可读性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.