在其他文件的结构/数组上使用malloc

时间:2018-11-12 18:11:15

标签: c struct malloc

更新:分段错误的问题不在此函数内,如下所述,它在同一程序的另一个函数内。

我正在尝试制作一个动画弹跳球的程序,但是我很困,无法弄清楚我在做什么错。我相信我已经将问题隔离在下面的功能之内。我已经弄清楚它与新模型语句有关。

无论如何,在运行代码时,我遇到了段错误,并且函数绘制的值(以三角形表示)偏离了应有的位置。我应该获得介于0到1600之间的值,但是有时我最终得到94百万。

任何帮助将不胜感激!

object_t *create_object(SDL_Surface *surface, triangle_t *model, int numtriangles){
    object_t *new=malloc(sizeof(object_t));
    new->surface = surface;
    new->model = malloc(sizeof(triangle_t)*numtriangles);
    *new->model= *model;
    new->numtriangles = numtriangles;
    new->tx = surface->w/2;
    new->ty = surface->h/2;
    new->scale = 0.1;
    new->rotation = 0.0;

    return new;
}

NB! Triangle_t *模型指针指向一个描述多个三角形的数组。

编辑: 包括对象的结构:

typedef struct object object_t;

struct object {
       float       scale;          /* Object scale */
       float       rotation;       /* Object rotation */
       float       tx, ty;         /* Position on screen */

       float       speedx, speedy; /* Object speed in x and y direction */
       unsigned int ttl;           /* Time till object should be removed from screen */

       int         numtriangles;   /* Number of triangles in model */
       triangle_t  *model;         /* Model triangle array */

       SDL_Surface *surface;       /* SDL screen */
};

以及三角形的结构:

typedef struct triangle triangle_t;

struct triangle {
    /* Model coordinates, where each pair resemble a corner  */
    int x1, y1;
    int x2, y2;
    int x3, y3;

    /* The color the triangle is to be filled with */
    unsigned int fillcolor;

    /* Scale factor, meaning 0.5 should half the size, 1 keep, and 2.0 double */
    float scale;

    /* The point (tx, ty) where the center of the teapot should be placed on-screen */
    int tx, ty;

    /* The degrees the triangle is supposed to be rotated at the current frame */
    float rotation;

    /* 
     * Bounding box of on-screen coordinates:
     * rect.x - x-coordinate of the bounding box' top left corner
     * rect.y - y-coordinate of the bounding box' top left corner
     * rect.w - width of the bounding box
     * rect.h - height of the bounding box
     */
     SDL_Rect rect;

    /* On-screen coordinates, where each pair resemble a corner */
    int sx1, sy1;
    int sx2, sy2;
    int sx3, sy3;
};

1 个答案:

答案 0 :(得分:2)

此行仅复制第一个三角形:

*new->model = *model;

从函数model的角度来看,它只是一个指向对象的指针。编译器不知道它指向三角形数组,因此我们需要将其中的三角形数量作为参数传递。

替换为:

memcpy( new->model, model, sizeof(triangle_t)*numtriangles);

其他评论:

  • 请记住在释放model时释放object
  • 如果您考虑使用c ++编译器进行编译,请用new之类的东西代替newObj

更多信息:

[编辑] 关于分段错误:您的函数现在是正确的,除非内存不足,否则不会引起SEGFAULT,这是非常不可能的。无论如何,如果您的内存不足并在该函数中获取SEGFAULT,则问题可能是:

  • 您没有在其他地方正确分配内存,然后内存泄漏使内存用尽不正确。
  • 您的平台需要更多的内存,尽管可能性不大,但可能会发生,尤其是在有限的嵌入式平台上

发布另一个带有段错误回溯的问题。