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?
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.
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;
};
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.
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.
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.)