我有一个像这样定义的 vector 3:
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;
我有一个函数,它只需要一个指向 Sprite 的指针,并假设创建一个 Sprite 然后返回它。像这样简单的事情:
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 数组。
像这样:
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");
}
像上面那样写出代码,第一个循环中的分配不起作用。如果我不首先调用数组的大小,则会出现段错误。
如果我添加了 calloc,我会得到一个
*** Error in `executable/main': corrupted double-linked list: 0x0000000001a15670 ***
关于解决这个问题有什么建议吗?
最佳答案
您的代码片段中有几件事让我觉得有点奇怪。虽然我不确定其中任何一个会导致您的错误。
vPrintS(sprites[i]->pose, "sprite index %d\n");
看起来像带有%d
的典型 printf 类型 va-args 函数> 说明符,但没有以下参数可匹配。vPrintS(sprites[i]->pose, "sprite index %d\n");
sprites[i] 是 cg_sprite 类型,它有一个pos
成员但没有pose
成员。sprite = calloc(1, sprite_count * sizeof(cg_sprite*));
您是否要将 calloc 的返回值分配给sprite
或sprites
?我看不到您在任何地方声明sprite
。
如果您需要更多信息才能回到正轨,我建议您提供 mcve
关于c - 动态创建自定义结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34724881/