programmazione C: puntatore Dereferencing all'errore tipo incompleto
-
24-09-2019 - |
Domanda
Ho una struttura definita come:
struct {
char name[32];
int size;
int start;
int popularity;
} stasher_file;
e un array di puntatori a quelle struct:
struct stasher_file *files[TOTAL_STORAGE_SIZE];
Nel mio codice, sto facendo un puntatore alla struttura e l'impostazione dei suoi membri, e l'aggiunta alla matrice:
...
struct stasher_file *newFile;
strncpy(newFile->name, name, 32);
newFile->size = size;
newFile->start = first_free;
newFile->popularity = 0;
files[num_files] = newFile;
...
sto ottenendo il seguente errore:
errore: dereferenziazione puntatore al tipo incompleto
ogni volta che provo ad accedere ai membri all'interno newFile
. Che cosa sto facendo di sbagliato?
Soluzione
Non hai definito struct stasher_file
dalla vostra prima definizione. Quello che è stato definito è un senza nome tipo struct e stasher_file
variabili di quel tipo. Dal momento che non c'è alcuna definizione per tale tipo di struct stasher_file
nel codice, il compilatore si lamenta tipo incompleto.
Al fine di definire struct stasher_file
, si avrebbe dovuto farlo nel modo seguente
struct stasher_file {
char name[32];
int size;
int start;
int popularity;
};
Nota in cui il nome stasher_file
è collocato nella definizione.
Altri suggerimenti
Si utilizza la newFile
puntatore senza allocare spazio per questo.
struct stasher_file *newFile = malloc(sizeof(stasher_file));
Inoltre si dovrebbe mettere il nome struct in alto. Dove si è specificato stasher_file è quello di creare un'istanza di tale struct.
struct stasher_file {
char name[32];
int size;
int start;
int popularity;
};
Come ha in effetti si definisce la struttura? Se
struct {
char name[32];
int size;
int start;
int popularity;
} stasher_file;
è da prendere come definizione di tipo, che manca di un typedef
. Quando scritta come sopra, in effetti si definisce una variabile chiamata stasher_file
, il cui tipo è un certo tipo struct anonimo.
Prova
typedef struct { ... } stasher_file;
(o, come già detto da altri):
struct stasher_file { ... };
Quest'ultimo in realtà adatti per l'utilizzo del tipo. La prima forma richiederebbe che si rimuove il struct
prima di dichiarazioni di variabili.
il caso di cui sopra è per un nuovo progetto. Mi ha colpito su questo errore durante la modifica di una forchetta di una biblioteca ben consolidata.
il typedef è stato incluso nel file stavo montando ma la struct non era.
Il risultato finale è che stavo cercando di modificare la struct nel posto sbagliato.
Se si esegue in questo modo in un look simile per altri luoghi dove la struct viene modificato e provare lì.
Il motivo per cui si sta ottenendo che l'errore è dovuto al fatto che avete dichiarato il vostro struct
come:
struct {
char name[32];
int size;
int start;
int popularity;
} stasher_file;
Questo non sta dichiarando un tipo stasher_file
. Questo sta dichiarando un anonymous tipo struct
e sta creando un'istanza globale denominata stasher_file
.
Che cosa si intende era:
struct stasher_file {
char name[32];
int size;
int start;
int popularity;
};
Ma nota che, mentre la risposta di Brian R. Bondy non era corretta sulla tua messaggio di errore, è giusto che si sta cercando di scrivere nella struct
senza avere spazio allocato per esso. Se si desidera un array di puntatori a strutture struct stasher_file
, è necessario chiamare malloc
per allocare lo spazio per ciascuno di essi:
struct stasher_file *newFile = malloc(sizeof *newFile);
if (newFile == NULL) {
/* Failure handling goes here. */
}
strncpy(newFile->name, name, 32);
newFile->size = size;
...
(a proposito, fare attenzione quando si usano strncpy
;. Non è garantito a NUL-terminare)