我有一个向量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;
我有一个函数,它只需要一个指向精灵的指针,并假设创建一个指针,然后返回它
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 %dn");
}
像上面那样写代码,第一个循环中的分配不起作用。如果我不先调用数组的大小,我就会出现seg错误。
如果我添加了胼胝体,我会得到
*** Error in `executable/main': corrupted double-linked list: 0x0000000001a15670 ***
有什么建议吗?
在您的代码片段中,有几件事让我觉得有点奇怪。虽然我不确定他们中的任何一个是造成你的错误。
vPrintS(sprites[i]->pose, "sprite index %dn");
类似于典型的printf类型va args函数,带有%d
说明符,但没有匹配的以下参数vPrintS(sprites[i]->pose, "sprite index %dn");
精灵[i]是具有pos
成员但没有pose
成员的cg_sprite类型sprite = calloc(1, sprite_count * sizeof(cg_sprite*));
您是想将calloc的返回值分配给sprite
还是sprites
?我看不出你在任何地方声明sprite
如果你需要更多的东西来回到正轨,我建议你提供一个mcve