web-dev-qa-db-fra.com

Erreur: Conversion en type non scalaire demandée

J'ai un petit problème à essayer de malloc cette structure . Voici le code de la structure:

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;

Et voici le code avec lequel j'ai un problème:

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

Cela me donne l'erreur "erreur: conversion en type non scalaire demandé" Quelqu'un peut-il m'aider à comprendre pourquoi?

11
atb

Vous ne pouvez rien attribuer à un type de structure. Ce que je suppose que vous vouliez écrire est:

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

Mais s'il vous plaît, ne spécifiez pas la valeur de retour de malloc() dans un programme C.

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

Cela fonctionnera parfaitement et ne vous cachera pas les bugs #include.

13
Carl Norum

malloc renvoie un pointeur. Ce que vous voulez probablement est la suivante:

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

Voici à quoi ressemble malloc:

void *malloc( size_t size );

Comme vous pouvez le voir renvoyer void*, cependant vous ne devriez pas transtyper la valeur de retour .

2
Jesse Good

La mémoire assignée par malloc doit être stockée dans un pointeur sur un objet, pas dans l'objet lui-même:

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