C - 访问结构中的动态数组

时间:2017-12-01 15:12:23

标签: c struct dynamic-arrays

我正在尝试使用动态数组对象创建集群。

结构定义如下:

<input type="hidden" id="cmd" name="cmd" value="_donations">

将对象添加到群集的功能是:

struct obj_t {
    int id;
    float x;
    float y;
};

struct cluster_t {
    int size;
    int capacity;
    struct obj_t *obj;
};

编辑:这是resize_cluster()函数:

void append_cluster(struct cluster_t *c, struct obj_t obj)
{
    if(c->capacity < (c->size + 1))
    {
        c = resize_cluster(c, c->size + 1);
    }
    if(c == NULL)
        return;
    c->obj[c->size] = obj;    //at this point program crashes.
    c->size++;
}

编辑2:这是集群初始化:

struct cluster_t *resize_cluster(struct cluster_t *c, int new_cap)
{
    if (c->capacity >= new_cap)
        return c;

    size_t size = sizeof(struct obj_t) * new_cap;

    void *arr = realloc(c->obj, size);
    if (arr == NULL)
        return NULL;

    c->obj = (struct obj_t*)arr;
    c->capacity = new_cap;
    return c;
}

当我尝试将对象添加到群集中的数组时,我无法弄清楚为什么程序崩溃了。访问数组这种方式错了吗?如果是这样,我应该如何访问它?

1 个答案:

答案 0 :(得分:3)

问题是对init_cluster()的调用。 c参数是按值传递的,因此无论您发送什么内容都保持不变:

struct cluster_t * c;
init_cluster(c, 1);
// c is uninitialized!

一个修复方法是将指针传递给对象:

struct cluster_t c;
init_cluster(&c, 1);

然后从c = malloc(sizeof(struct cluster_t));;

中删除init_cluster()

或者,您可以创建alloc_cluster函数:

struct cluster_t * alloc_cluster(int cap)
{
    c = malloc(sizeof(struct cluster_t));
    c->size = 0;
    c->capacity = cap;
    c->obj = malloc(cap * sizeof(struct obj_t));
    return c;
}

并称之为:

struct cluster_t *c = init_cluster(1);