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?

È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top