web-dev-qa-db-ja.com

エラー:非スカラータイプへの変換が要求されました

この構造体をmallocしようとすると、小さな問題が発生します。構造体のコードは次のとおりです。

typedef struct stats {                  
    int strength;               
    int wisdom;                 
    int agility;                
} stats;

typedef struct inventory {
    int n_items;
    char **wepons;
    char **armor;
    char **potions;
    char **special;
} inventory;

typedef struct rooms {
    int n_monsters;
    int visited;
    struct rooms *nentry;
    struct rooms *sentry;
    struct rooms *wentry;
    struct rooms *eentry;
    struct monster *monsters;
} rooms;

typedef struct monster {
    int difficulty;
    char *name;
    char *type;
    int hp;
} monster;

typedef struct dungeon {
    char *name;
    int n_rooms;
    rooms *rm;
} dungeon;

typedef struct player {
    int maxhealth;
    int curhealth;
    int mana;
    char *class;
    char *condition;
    stats stats;
    rooms c_room;
} player;

typedef struct game_structure {
    player p1;
    dungeon d;
} game_structure;

そして、私が問題を抱えているコードは次のとおりです:

dungeon d1 = (dungeon) malloc(sizeof(dungeon));

「エラー:非スカラータイプへの変換が要求されました」というエラーが表示されます。

13
atb

構造型には何もキャストできません。あなたが書くつもりだったと私が思うのは:

_dungeon *d1 = (dungeon *)malloc(sizeof(dungeon));
_

ただし、Cプログラムでmalloc()の戻り値をキャストしないでください。

_dungeon *d1 = malloc(sizeof(dungeon));
_

うまく動作し、_#include_バグを隠しません。

14
Carl Norum

mallocはポインターを返すため、おそらく次のものが必要です。

dungeon* d1 = malloc(sizeof(dungeon));

Mallocは次のようになります。

void *malloc( size_t size );

ご覧のとおり、void*、しかしあなたは 戻り値をキャストすべきではない

2
Jesse Good

mallocによって割り当てられたメモリは、オブジェクト自体ではなく、オブジェクトへのポインタに保存する必要があります。

dungeon *d1 = malloc(sizeof(dungeon));
0
Adam Liss