Fehler: Dereferenzieren des Zeigers auf unvollständigen Typ
wenn ich versuche, auf die Mitglieder im Inneren zuzugreifen newFile. Was mache ich falsch?
Danke an alle für die Hilfe 🙂
– verwirrtKind
5. April 2010 um 1:59 Uhr
Übrigens hatte ich den gleichen Fehler, aber das Problem war, dass ich keine bestimmte Header-Datei (in einem großen Projekt) eingebunden habe.
– ady
6. Mai 2016 um 18:51 Uhr
Sie haben nicht definiert struct stasher_file nach Ihrer ersten Definition. Was Sie definiert haben, ist ein namenlos Strukturtyp und eine Variable stasher_file von diesem Typ. Da es keine Definition für solche Typen wie gibt struct stasher_file In Ihrem Code beschwert sich der Compiler über unvollständigen Typ.
Um zu definieren struct stasher_filehättest du es wie folgt machen sollen
struct stasher_file {
char name[32];
int size;
int start;
int popularity;
};
Beachten Sie, wo die stasher_file Name wird in die Definition aufgenommen.
+1 Schneller als ich und mit struct stasher_file anstelle einer typedef stimmt mit der Verwendung des Typs im Beispiel durch das OP überein.
– Dirk
5. April 2010 um 1:52 Uhr
Brian R. Bondy
Sie verwenden den Zeiger newFile ohne Platz dafür zuzuweisen.
Außerdem sollten Sie den Strukturnamen an die Spitze setzen. Wo Sie stasher_file angegeben haben, soll eine Instanz dieser Struktur erstellt werden.
struct stasher_file {
char name[32];
int size;
int start;
int popularity;
};
Wie weise ich Platz dafür zu?
– verwirrtKind
5. April 2010 um 1:47 Uhr
Ich habe der neuen Datei keinen Speicherplatz zugewiesen, aber die Definition von stasher_file so geändert, dass sie Ihrer entspricht, und der Fehler ist nicht aufgetreten. Muss ich noch Speicherplatz zuweisen?
– verwirrtKind
5. April 2010 um 1:55 Uhr
@confuseKid: Ja, Sie müssen Speicherplatz zuweisen, wie ich ihn angegeben habe. Achten Sie auch darauf, es zu befreien, wenn Sie damit fertig sind.
– Brian R. Bondy
5. April 2010 um 1:57 Uhr
@confuseKid: Ich empfehle Ihnen, die Antwort von @AndreyT zu akzeptieren, er gibt eine bessere Erklärung für die Fehlerquelle.
– Brian R. Bondy
5. April 2010 um 1:57 Uhr
Ich glaube, die eigentlich gestellte Frage war “Was mache ich falsch?”, also ist dies eine vollständigere Antwort.
– Marconius
21. März 2013 um 18:02 Uhr
Wie haben Sie eigentlich die Struktur definiert? Wenn
struct {
char name[32];
int size;
int start;
int popularity;
} stasher_file;
ist als Typdefinition zu verstehen, es fehlt a typedef. Wenn Sie wie oben geschrieben sind, definieren Sie tatsächlich eine Variable mit dem Namen stasher_filedessen Typ ein anonymer Strukturtyp ist.
Versuchen
typedef struct { ... } stasher_file;
(oder, wie schon von anderen erwähnt):
struct stasher_file { ... };
Letzteres entspricht tatsächlich Ihrer Verwendung des Typs. Das erste Formular würde erfordern, dass Sie die entfernen struct vor Variablendeklarationen.
Der obige Fall gilt für ein neues Projekt. Ich bin auf diesen Fehler gestoßen, als ich einen Fork einer gut etablierten Bibliothek bearbeitet habe.
Die Typedef war in der Datei enthalten, die ich bearbeitete, die Struktur jedoch nicht.
Das Endergebnis war, dass ich versuchte, die Struktur an der falschen Stelle zu bearbeiten.
Wenn Sie auf ähnliche Weise darauf stoßen, suchen Sie nach anderen Stellen, an denen die Struktur bearbeitet wird, und versuchen Sie es dort.
Der Grund, warum Sie diesen Fehler erhalten, ist, dass Sie Ihre deklariert haben struct wie:
struct {
char name[32];
int size;
int start;
int popularity;
} stasher_file;
Dies erklärt nicht a stasher_file Typ. Dies erklärt ein anonymstruct type und erstellt eine globale Instanz mit dem Namen stasher_file.
Was Sie beabsichtigten, war:
struct stasher_file {
char name[32];
int size;
int start;
int popularity;
};
Beachten Sie jedoch, dass Brian R. Bondys Antwort zu Ihrer Fehlermeldung zwar nicht korrekt war, er jedoch Recht hat, dass Sie versuchen, in die zu schreiben struct ohne Platz dafür zugewiesen zu haben. Wenn Sie ein Array von Zeigern auf struct stasher_file Strukturen, müssen Sie anrufen malloc Platz für jeden zuweisen:
(Übrigens, seien Sie vorsichtig bei der Verwendung strncpy; Es ist nicht garantiert, dass NUL beendet wird.)
wenn Sie die Struktur als typedef struct { … } stasher_file definiert haben; dann können Sie malloc als stasher_file verwenden *newFile = malloc(sizeof (stasher_file);
– katta
22. April 2013 um 20:10 Uhr
@katta Ja, aber viele Leute halten es für eine bessere Vorgehensweise T* p = malloc(sizeof *p) stattdessen. Auf diese Weise, wenn die Art von p sich jemals ändert, müssen Sie nur seine Deklaration aktualisieren und nicht die malloc Websites. Vergessen zu aktualisieren malloc Websites würden stillschweigend die falsche Menge an Speicher zuweisen, was möglicherweise zu Pufferüberläufen führen würde.
– jamesdlin
22. April 2013 um 23:06 Uhr
@katta Siehe auch stackoverflow.com/questions/373252/…
– jamesdlin
22. April 2013 um 23:34 Uhr
guo-sj
Der Grund ist Sie haben den Typ nicht deklariert struct stasher_filedefinieren Sie eine Strukturvariable stasher_file
stattdessen.
Im Cdie Deklaration der Struktur:
struct structure-tag {
member1
member2
...
};
structure-tag ist ein optionaler Name nach dem Schlüsselwort struct. Nach der Deklaration können Sie definieren eine Variable:
struct structure-tag var1, *var2;
Außerdem können Sie sowohl Deklaration als auch Definition wie folgt ausführen:
In deinem Fall könntest du also Folgendes versuchen:
struct stasher_file {
char name[32];
int size;
int start;
int popularity;
} *files[TOTAL_STORAGE_SIZE];
struct stasher_file *newFile = malloc(sizeof(struct stasher_file));
... other code ...
Das ist alles.
wenn Sie die Struktur als typedef struct { … } stasher_file definiert haben; dann können Sie malloc als stasher_file verwenden *newFile = malloc(sizeof (stasher_file);
– katta
22. April 2013 um 20:10 Uhr
@katta Ja, aber viele Leute halten es für eine bessere Vorgehensweise T* p = malloc(sizeof *p) stattdessen. Auf diese Weise, wenn die Art von p sich jemals ändert, müssen Sie nur seine Deklaration aktualisieren und nicht die malloc Websites. Vergessen zu aktualisieren malloc Websites würden stillschweigend die falsche Menge an Speicher zuweisen, was möglicherweise zu Pufferüberläufen führen würde.
– jamesdlin
22. April 2013 um 23:06 Uhr
@katta Siehe auch stackoverflow.com/questions/373252/…
– jamesdlin
22. April 2013 um 23:34 Uhr
14022900cookie-checkC-Programmierung: Dereferenzierungszeiger auf unvollständigen Typfehleryes
Danke an alle für die Hilfe 🙂
– verwirrtKind
5. April 2010 um 1:59 Uhr
Übrigens hatte ich den gleichen Fehler, aber das Problem war, dass ich keine bestimmte Header-Datei (in einem großen Projekt) eingebunden habe.
– ady
6. Mai 2016 um 18:51 Uhr