我正在尝试使用动态数组对象创建集群。
结构定义如下:
<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;
}
当我尝试将对象添加到群集中的数组时,我无法弄清楚为什么程序崩溃了。访问数组这种方式错了吗?如果是这样,我应该如何访问它?
答案 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);