Ausdruck muss ein Zeiger auf einen vollständigen Objekttyp sein, der einfache Zeigerarithmetik verwendet [duplicate]

Lesezeit: 1 Minute

Ich versuche, einige grundlegende Zeigerarithmetik mit einem void * durchzuführen. Mein eigentlicher Code berechnet einen Offset, indem er sizeof verwendet und dann multipliziert. Hier ist Beispielcode, um eine Instanz des Problems selbst anzuzeigen.

void * p;
p = 0;
p = p + 1;

Ich verwende den MSVC-Compiler in C (nicht C++).

Der Fehler ist:

expression must be a pointer to a complete object type  

Ich verstehe nicht, was dieser Fehler sagen will. Hier gibt es kein Objekt oder keine Struktur.

  • Nicht wirklich. Ich habe es zuerst gelesen.

    – 101010

    29. Juni 2014 um 2:49 Uhr

  • void hat keine Größe, also Zeigerarithmetik auf a void * ist nicht erlaubt.

    – Benutzer3386109

    29. Juni 2014 um 2:49 Uhr

  • Das hört sich an, als könnte es daran liegen. Es besagt, dass das Hinzufügen zu einer Leerstelle * eine GCC-Erweiterung ist. (seltsam, weil es im C++-Modus des MSVC-Compilers funktioniert) stackoverflow.com/questions/20154575/error-void-unknown-size

    – 101010

    29. Juni 2014 um 2:49 Uhr

  • Es fällt mir schwer, einen Dup zu finden, aber es muss einen geben, siehe Typ von Zeigern deklarieren? zur Zeit.

    – Shafik Yaghmour

    29. Juni 2014 um 2:51 Uhr

  • stackoverflow.com/questions/3523145/…

    – Mafso

    29. Juni 2014 um 2:54 Uhr

Zeigerarithmetik bezieht sich immer auf die Größe der Objekte, auf die gezeigt wird. Inkrementieren von a char* wird die Adresse um eins vorrücken, während z int* normalerweise wären es vier (Bytes). Aber void hat unbekannte Größe, also Zeigerarithmetik auf void* ist laut Norm nicht erlaubt. Zuerst in den entsprechenden Typ umwandeln; Wenn Sie die Adresse nur so manipulieren möchten, als wäre es eine Nummer, dann wandeln Sie sie um char* oder verwenden intptr_t.

1206080cookie-checkAusdruck muss ein Zeiger auf einen vollständigen Objekttyp sein, der einfache Zeigerarithmetik verwendet [duplicate]

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

Privacy policy