1

間違いなく私の考えの誤りによる問題を抱えていますが、頭を抱えているようには見えません。私は次のような構造体を持っています:

typedef struct
{
    ALLEGRO_BITMAP *bitmap;
    char name[255];
    signed int  step;       // How many frames to move per cycle. Negative values will cause the animation to reverse. Affects "current" frame only.
    ANNE_SPRITE_CYCLES cycles;
    ANNE_SPRITE_ANIMATIONS anim;
    ANNE_SPRITE_FRAME current;
} ANNE_SPRITE; 

malloc() してからすぐに解放すると、すべて問題ありません。

ANNE_SPRITE *sprite = malloc(sizeof(ANNE_SPRITE));
free(sprite);
printf("Haven't crashed yet, boss!");

ただし、関数内に構造体を構築すると、次のようになります。

ANNE_SPRITE anne_sprite_load(char sprite_name[]){
    ANNE_SPRITE *sprite = malloc(sizeof(ANNE_SPRITE));
    //Snipped: a bunch of code to populate the struct with data
    return *sprite;
}

次に、愛やお金の呼び出しコンテキストで構造体の割り当てを解除できません。

ANNE_SPRITE test = anne_sprite_load("awesome_sprite");
free(test);

これにより、コンパイラ エラーが発生しますpassing 'ANNE_SPRITE' to parameter of incompatible type 'void *'。実際、私は です。しかし、この変数を free() で動作する準備が整っている形式に仕上げる方法に途方に暮れています。

4

2 に答える 2

2
ANNE_SPRITE* anne_sprite_load(char sprite_name[]){  // <== Change return type to be a pointer.
    ANNE_SPRITE *sprite = malloc(sizeof(ANNE_SPRITE));
    //Snipped: a bunch of code to populate the struct with data
    return sprite;  // <== Return the pointer.
}


ANNE_SPRITE* pTest = anne_sprite_load("awesome_sprite");  // <== Change to pointer type
free(pTest);  // <== Now free will work
于 2013-11-06T04:04:22.660 に答える
2

2 番目の例が返されますANNE_SPRITE(つまり、ポインタではなく構造体)。署名を に変更し、ANNE_SPRITE* anne_sprite_load(char sprite_name[])を調整する必要がありreturn statementます。

于 2013-11-06T04:04:42.473 に答える