我有这些结构:
struct generic_attribute{
int current_value;
int previous_value;
};
union union_attribute{
struct complex_attribute *complex;
struct generic_attribute *generic;
};
struct tagged_attribute{
enum{GENERIC_ATTRIBUTE, COMPLEX_ATTRIBUTE} code;
union union_attribute *attribute;
};
我不断收到分段错误错误,因为我在创建tagged_attribute
类型的对象时没有正确分配内存。
struct tagged_attribute* construct_tagged_attribute(int num_args, int *args){
struct tagged_attribute *ta_ptr;
ta_ptr = malloc (sizeof(struct tagged_attribute));
ta_ptr->code = GENERIC_ATTRIBUTE;
//the problem is here:
ta_ptr->attribute->generic = malloc (sizeof(struct generic_attribute));
ta_ptr->attribute->generic = construct_generic_attribute(args[0]);
return ta_ptr;
}
construct_generic_attribute
返回指向generic_attribute
对象的指针。我希望ta_ptr->attribute->generic
包含指向generic_attribute
对象的指针。指向generic_attribute
对象的指针由construct_generic_attribute
函数输出。
这样做的正确方法是什么?
答案 0 :(得分:2)
您还需要为attribute
成员分配空间。
struct tagged_attribute* construct_tagged_attribute(int num_args, int *args)
{
struct tagged_attribute *ta_ptr;
ta_ptr = malloc(sizeof(struct tagged_attribute));
if (ta_ptr == NULL)
return NULL;
ta_ptr->code = GENERIC_ATTRIBUTE;
ta_ptr->attribute = malloc(sizeof(*ta_ptr->attribute));
if (ta_ptr->attribute == NULL)
{
free(ta_ptr);
return NULL;
}
/* ? ta_ptr->attribute->generic = ? construct_generic_attribute(args[0]); ? */
/* not sure this is what you want */
return ta_ptr;
}
并且您不应该malloc()
为该属性,然后重新分配指针,事实上你的联盟不应该有poitner,因为它根本没有任何用途,它是' sa { {1}}其中两个成员都是指针。
这会更有意义
union
所以你要设置像
这样的联合值union union_attribute {
struct complex_attribute complex;
struct generic_attribute generic;
};