动态创建自定义结构数组

时间:2016-01-11 15:15:45

标签: c pointers segmentation-fault malloc calloc

我有一个像这样定义的vector3:

typedef struct {
    float x;
    float y;
    float z;
} vec3;

然后我在这个数据结构中有一些:

typedef struct sprite {
    cg_quad* quad;
    vec3 scale;
    vec3 pos;
    vec3 angl;
}cg_sprite;

以及这个四元组的好措施:

typedef struct {
    vec3 angles;
    GLshort vertex_count;
    GLfloat vertices[12];
    GLfloat colors[16];
    GLshort indices[6];
    GLfloat tex_coords[8];
} cg_quad;

我有一个函数,只需要一个指向精灵的指针,并假设创建一个然后返回它。像这样简单:

cg_sprite* cg_sprite_new(const float x_pos, const float y_pos, const float z_pos, const float w, const float h) {
     cg_sprite* out = calloc(1, sizeof(cg_sprite));
     v3MakeFromElems(&out->scale, w, h, 1);
     v3MakeFromElems(&out->pos, x_pos, y_pos, z_pos);
     v3MakeFromElems(&out->angl, 0.0, 0.0, 0.0);

     v3PrintS(&out->scale);
     v3PrintS(&out->pos);
     v3PrintS(&out->angl);

     return out;
}

这适用于一个人。我想分配一个我可以更新和使用的精灵数组。

类似的东西:

sprite_count = 1;
cg_sprite* sprites;


sprite = calloc(1, sprite_count * sizeof(cg_sprite*));

for(int i = 0; i < sprite_count; i++) {
  sprites[i] = *cg_sprite_new(xpos, ypos, zpos, width, height);
}

然后像这样迭代它们。

for(int i = 0; i < sprite_count; i++) {
   vPrintS(sprites[i]->pose, "sprite index %d\n");
}

写出上面的代码,第一个循环中的分配不起作用。如果我没有首先调用数组的大小,我会得到一个seg错误。

如果我确实添加了calloc,我会得到一个

*** Error in `executable/main': corrupted double-linked list: 0x0000000001a15670 ***

有关排序的建议吗?

1 个答案:

答案 0 :(得分:1)

在你的代码片段中,有一些事情让我觉得有些奇怪。虽然我不确定是否有任何一个导致您的错误。

  1. vPrintS(sprites[i]->pose, "sprite index %d\n"); Lools就像一个典型的printf类型的va-args函数,带有%d说明符但没有匹配的后续参数。
  2. vPrintS(sprites[i]->pose, "sprite index %d\n"); sprites [i]的类型为cg_sprite,其中pos成员但没有成员pose
  3. sprite = calloc(1, sprite_count * sizeof(cg_sprite*));您是想将calloc的返回值分配给sprite还是sprites?我无法在任何地方声明sprite
  4. 如果您需要更多信息,我建议您提供mcve