代码之家  ›  专栏  ›  技术社区  ›  Tracy Aviaja

释放由malloc分配的结构会导致错误吗?

  •  1
  • Tracy Aviaja  · 技术社区  · 8 年前

    typedef struct{
        float x;
        float y;
    } vector;
    
    typedef struct{
        vector *vec;
        void (*update)();
    } velocity;
    
    typedef struct{
        vector *vec;
        velocity *vel;
        void (*move)();
    } hero;
    

    下面是给我一个错误的代码:

    hero *h;
    // allocate memory for hero 
    h = malloc(sizeof(hero*));
    // allocate memory for velocity
    h->vel = malloc(sizeof(velocity*));
    
    // initialize vectors
    h->vec = malloc(sizeof(vector*));
    h->vel->vec = malloc(sizeof(vector*));
    
    free(h->vec); // free hero vector
    free(h->vel->vec); // free velocity vector
    free(h->vel); // free velocity
    free(h); // free hero
    

    3 回复  |  直到 8 年前
        1
  •  4
  •   dbush    8 年前

    执行此操作时:

    h = malloc(sizeof(hero*));
    

    指向英雄的指针 ,而不是

    因此,您没有为结构分配足够的内存,并且写入到结构的字段写入超过分配内存的末尾。这将调用 undefined behavior ,在您的特定情况下,它在调用时表现为崩溃 free .

    * 来自 sizeof 表达式为结构实例分配足够的空间:

    hero *h;
    // allocate memory for hero 
    h = malloc(sizeof(hero));
    // allocate memory for velocity
    h->vel = malloc(sizeof(velocity));
    
    // initialize vectors
    h->vec = malloc(sizeof(vector));
    h->vel->vec = malloc(sizeof(vector));
    
        2
  •  1
  •   Some programmer dude    8 年前

    h 声明为 hero *h; 然后为一个 hero ,而不是实际情况 结构更改为

    h = malloc(sizeof *h);
    

    与其他分配相同。

    这将导致您在分配的内存范围外写入数据,而这反过来又会导致 .

        3
  •  0
  •   0___________    8 年前
    h = malloc(sizeof(hero*));
    

    您只需为指针大小分配内存,而不是结构本身

    对于宏风扇:

    #define SMALLOC(x)      (malloc(sizeof *(x)))
    
    hero *h;
    h = SMALLOC(h);
    h->vel = SMALLOC(h->vel);
    
    // initialize vectors
    h->vec = SMALLOC(h->vec)
    h->vel->vec = SMALLOC(h->vel->vec);