C-Programmierung: Dereferenzierungszeiger auf unvollständigen Typfehler

Lesezeit: 5 Minuten

verwirrtKids Benutzeravatar
verwirrtKind

Ich habe eine Struktur definiert als:

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

und ein Array von Zeigern auf diese Strukturen:

struct stasher_file *files[TOTAL_STORAGE_SIZE];

In meinem Code mache ich einen Zeiger auf die Struktur, setze ihre Mitglieder und füge sie dem Array hinzu:

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

Ich erhalte den folgenden Fehler:

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

Benutzeravatar von Brian R. Bondy
Brian R. Bondy

Sie verwenden den Zeiger newFile ohne Platz dafür zuzuweisen.

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

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 anonym struct 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:

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

(Ü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

Benutzeravatar von guo-sj
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:

    struct structure-tag {
        member1
        member2
        ...
    } var1, *var2;

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

1402290cookie-checkC-Programmierung: Dereferenzierungszeiger auf unvollständigen Typfehler

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy