Zeigerarithmetik bei Leere unbekannter Größe [geschlossen]

In Visual Studio C ++ Version 9 (und wahrscheinlich auch in anderen Versionen) der folgende Code:

int a = sizeof(void);
void const *b = static_cast<void const *>("hello world");
b += 6;

Erzeugtdiese fehler:

error C2070: 'void': illegal sizeof operand
error C2036: 'const void *' : unknown size

Dieser Code funktioniert unter GCC, das behandeltsizeof(void) wie1.

Gibt es einen Weg, um diese Einschränkung zu umgehen, als explizit aufchar * zum Zwecke der Zeigerarithmetik trägt zur Verwirrung bei (void * ist bekannt und wird als typloser Zeiger auf den Rohspeicher verwendet.

Update0Bitte beachten Sie, dass mir die Existenz des Standards bekannt ist.I wollen rohe Zeiger Arithmetik zu tun.ich nehmesizeof(void) um zu zeigen, dass ich mir der Tatsache bewusst bin, dass es nicht so ist1 ist die Ursache des Problems.Das Codebeispiel soll lediglich veranschaulichen, was zum Generieren der Fehler erforderlich ist.Ich weiß, dass dies kein "normaler" Weg istvoid, aber das ist C, und diese Dinge passieren.Ja, die Leute müssen dies auf niedrigem Niveau tun. Ich bin nicht hinter dem Warum her, ich bin hinter dem Wie her. Wenn Sie wissen möchten, warum, werfen Sie einen Blick auf eine Kernelquelle oder Ihre freundliche Glibc.Update1

Es scheint, dass diese Frage viel Verwirrung gestiftet hat. Die Frage dreht sich nicht umWarum habensizeof(void) == 1 ist kein Standard, aber was ist zu tun, wenn es nicht ist.

In dem Fall, dass eine Einzelbyte-Zeiger-Arithmetik durchgeführt werden soll, stellt sich heraus, dass das Casting aufchar * ist die richtige Antwort, nicht weil*(void *) hat keine größe, sondern weil der standard das eigentlich garantiert*(char *) ist immer1. Daher die Verwendung vonchar * ist immer richtig und kongruent mitvoid * mit der GCC-Erweiterung zum Zwecke der Rohzeigerarithmetik.

Um den Punkt weiter zu verstärken,void * ist die richtige Wahl für Zeiger auf typenlosen Speicher, undchar * ist der richtige Typ für das Castingfür rohe Zeigerarithmetik.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage