c - 动态创建自定义结构数组

标签 c pointers segmentation-fault malloc calloc

我有一个像这样定义的 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 ***

关于解决这个问题有什么建议吗?

最佳答案

您的代码片段中有几件事让我觉得有点奇怪。虽然我不确定其中任何一个会导致您的错误。

  1. vPrintS(sprites[i]->pose, "sprite index %d\n"); 看起来像带有 %d 的典型 printf 类型 va-args 函数> 说明符,但没有以下参数可匹配。
  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 的返回值分配给 spritesprites?我看不到您在任何地方声明sprite

如果您需要更多信息才能回到正轨,我建议您提供 mcve

关于c - 动态创建自定义结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34724881/

相关文章:

Eclipse 中的一个包和文件夹结构中可以有多个文件吗?

c++ - 什么是 C/C++ for Windows 中基于共享内存的轻量级 IPC 机制?

c - 将内存分配给C中的二维数组

linux - Python 2.7 "import hashlib"段错误

C - 更改 while 循环中条件的位置导致 C 中的段错误?

c++ - 从 C-Style 字符串 C++ 中删除字符

c - C 和代码块出现问题 : Error with debug called 'error: ld returned 1 exit status'

c++ - 将指针设置为 NULL 会影响您指向的原始项目吗?

c - 为什么在访问阻塞/受限内存位置时不会出现段错误?

c - 通过将参数传递给函数而导致段错误(C、Linux 上的代码块)