我已经宣布了这一系列的工会:
union Function {
char* name;
double (*fnct)();
int args;
};
union Function functions[] = {
{.name = "acos", .fnct = acos, .args = 1},
{.name = "asin", .fnct = asin, .args = 1},
{.name = "atan", .fnct = atan, .args = 1},
};
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用它时,我得到一个Segmentation fault错误.
for(int i = 0; i < sizeof(functions) / sizeof(union Function); i++) {
printf("%d\n", functions[i].args);
printf("%s\n", functions[i].name); //HERE!
}
Run Code Online (Sandbox Code Playgroud)
一名工会包含任何成员,而不是所有成员.
所以最后一个初始化器是最后一个,意味着它的值是正确的1.因此,打印名称(字符串)会导致seg错误,因为printf尝试取消引用地址1.
如果您想拥有所有成员,请使用struct而不是union.