web-dev-qa-db-fra.com

Programmation C: pointeur de déréférencement en erreur de type incomplet

J'ai une structure définie comme:

struct {
 char name[32];
 int  size;
 int  start;
 int  popularity;
} stasher_file;

et un tableau de pointeurs vers ces structures:

struct stasher_file *files[TOTAL_STORAGE_SIZE];

Dans mon code, je fais un pointeur sur la structure et la définition de ses membres, et l'ajoute au tableau:

 ...
 struct stasher_file *newFile;
 strncpy(newFile->name, name, 32);
 newFile->size = size;
 newFile->start = first_free;
 newFile->popularity = 0;
 files[num_files] = newFile;
 ...

Je reçois l'erreur suivante:

erreur: déréférencement du pointeur sur le type incomplet

chaque fois que j'essaie d'accéder aux membres à l'intérieur de newFile. Qu'est-ce que je fais mal?

38
confusedKid

Vous n'avez pas défini struct stasher_file par votre première définition. Ce que vous avez défini est un type struct sans nom et une variable stasher_file de ce type. Comme il n'y a pas de définition pour un type tel que struct stasher_file _ dans votre code, le compilateur se plaint du type incomplet.

Afin de définir struct stasher_file, vous auriez dû le faire comme suit

struct stasher_file {
 char name[32];
 int  size;
 int  start;
 int  popularity;
};

Notez où le stasher_file nom est placé dans la définition.

47
AnT

Vous utilisez le pointeur newFile sans y allouer d'espace.

struct stasher_file *newFile = malloc(sizeof(stasher_file));

Aussi, vous devriez mettre le nom de la structure en haut. Où vous avez spécifié stasher_file est de créer une instance de cette structure.

struct stasher_file {
    char name[32];
    int  size;
    int  start;
    int  popularity;
};
13
Brian R. Bondy

Comment avez-vous défini la structure? Si

struct {
  char name[32];
  int  size;
  int  start;
  int  popularity;
} stasher_file;

doit être pris comme définition de type, il manque un typedef. Lorsque vous écrivez comme ci-dessus, vous définissez en fait une variable appelée stasher_file, dont le type est un type de structure anonyme.

Essayer

typedef struct { ... } stasher_file;

(ou, comme déjà mentionné par d'autres):

struct stasher_file { ... };

Ce dernier correspond en fait à votre utilisation du type. La première forme nécessiterait que vous supprimiez le struct avant les déclarations de variables.

10
Dirk

le cas ci-dessus est pour un nouveau projet. J'ai trouvé cette erreur en éditant une fourche d'une bibliothèque bien établie.

le typedef était inclus dans le fichier que j'éditais, mais la structure ne l'était pas.

Le résultat final étant que j'essayais de modifier la structure au mauvais endroit.

Si vous rencontrez cela de la même manière, cherchez d'autres endroits où la structure est modifiée et essayez-la.

5
Pete Brumm

Vous obtenez cette erreur parce que vous avez déclaré votre struct comme:

struct {
 char name[32];
 int  size;
 int  start;
 int  popularity;
} stasher_file;

Ceci ne déclare pas un stasher_file type. Ceci déclare un type anonymestruct et crée une instance globale nommée stasher_file.

Ce que vous vouliez, c'était:

struct stasher_file {
 char name[32];
 int  size;
 int  start;
 int  popularity;
};

Mais notez que bien que la réponse de Brian R. Bondy n’ait pas été correcte à propos de votre message d’erreur, il a raison de dire que vous essayez d’écrire dans le struct sans y avoir alloué de place. Si vous voulez un tableau de pointeurs sur struct stasher_file _ structures, vous devrez appeler malloc pour allouer de l’espace à chacune d’elles:

struct stasher_file *newFile = malloc(sizeof *newFile);
if (newFile == NULL) {
   /* Failure handling goes here. */
}
strncpy(newFile->name, name, 32);
newFile->size = size;
...

(BTW, soyez prudent lorsque vous utilisez strncpy; sa terminaison NUL n'est pas garantie.)

1
jamesdlin