如何为结构中的指针数组分配内存?

时间:2015-06-27 21:09:20

标签: c pointers structure allocation unions

我有这些结构:

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函数输出。

这样做的正确方法是什么?

1 个答案:

答案 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;
};