Mögliche Duplizieren:
What is the size of void?Warum ist sizeof (void) == 1?
In §6.2.5.19, lassen Sie uns die Propheten, dass wissen:
Der
void
Typ umfasst einen leeren Satz von Werten
Die Warum ergibt sizeof(void)
1, wenn 0 zu genügen scheint?
Mögliche Duplizieren:
What is the size of void?Warum ist sizeof (void) == 1?
In §6.2.5.19, lassen Sie uns die Propheten, dass wissen:
Der
void
Typ umfasst einen leeren Satz von Werten
Die Warum ergibt sizeof(void)
1, wenn 0 zu genügen scheint?
sizeof(void)
wird nicht auf einem C-Compiler kompiliert werden.
ISO 9899: 2011 6.2.5/19
"Der void type enthält eine leere Menge von Werten; es ist ein unvollständiger Objekttyp, der nicht abgeschlossen werden kann."
ISO 9899: 2011 6.5.3.4/1
"Der Operator sizeof soll nicht auf einen Ausdruck angewandt werden, den Funktionstyp oder einen unvollständigen Typen hat"
Dies ist normativer Text : sizeof (void) ist ungültig C.
... und doch kompiliert es mit gcc, da es eine gcc-Erweiterung ist. Siehe http : //gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith – Philip
Ich frage mich, wie dies die Frage des OP beantwortet ... – ThiefMaster
@Philip Ja, in der Tat, aber es wird kompilieren Sie nicht auf einer konformen Implementierung eines C-Compilers – Lundin
Es ist eine gcc-Erweiterung: http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith
In GNU C, Addition und Subtraktion Operationen werden auf Hinweise auf
void
und Zeiger auf Funktionen unterstützt. Dies wird durch die Behandlung der Größe einesvoid
oder einer Funktion als 1.Eine Folge davon ist, dass getan
sizeof
auch aufvoid
und auf Funktionstypen erlaubt ist, und kehrt 1.Die Option
-Wpointer-arith
Anfragen eine Warnung, wenn diese Erweiterungen verwendet werden.
Der Grund, warum void
eine solche Größe, arithmetics ausführen muss, ist, dass ptr - ptr2
nicht tatsächlich gibt Ihnen die numerische Differenz der Adressen, sondern die Anzahl der Elemente die beiden Zeiger voneinander entfernt sind - und die Größe eines Elements wies auf von void *ptr
ist sizeof(*ptr)
, die sizeof(void)
ist.
Wenn dies eine Erweiterung ist, warum gibt 'gcc -std = c99 -pedantic' sizeof (void) == 1? -pedantic gibt eine Warnung für die Verwendung von sizeof auf einen Void-Typ, aber der Code kompiliert und druckt 1. – Lundin
@Lundin: weil Sie '-pedantic' und nicht' -pedantic-Fehler' verwendet – Christoph
@Christoph Meiner Meinung nach sollte es sein ausreichend, um das Flag -std = c99 zu setzen, und dann sollte es nicht einmal erlauben, dass der Code ohne Fehler kompiliert wird. – Lundin
Sie verwenden wahrscheinlich gcc oder einen anderen Compiler, der dies als Erweiterung tut (in C ist sizeof (void) nicht gültig).
gcc sagt:
In GNU C, Addition und Subtraktion Operationen auf Zeigern unterstützt werden ungültig zu erklären und auf Zeiger auf Funktionen. Dies wird durch die Behandlung der Größe eines Hohlraums oder einer Funktion als 1.
Eine Folge davon getan ist, dass sizeof auch auf Lücke erlaubt ist und auf Funktionstypen und gibt 1.
Die Option -Wointer-arit fordert eine Warnung an, wenn diese Erweiterungen verwendet werden.
... und es ist ungültig wegen §6.5.3.4.1: "Der Operator sizeof darf nicht auf einen Ausdruck angewendet werden, der einen Funktionstyp oder einen unvollständigen Typ hat, auf den eingeklammerten Namen eines solchen Typs oder auf einen Ausdruck, der ein Bitfeld-Mitglied bezeichnet "und §6.2.5.19:" 'void' ist ein" unvollständiger Typ, der nicht vervollständigt werden kann. " – Philip
http://StackOverflow.com/questions/1666224/what-is-the-size-of-void –
Es gibt einen Unterschied zwischen dieser Frage und ihrem älteren Duplikat: dieses ist akzeptierte Antwort enthält ac tlicher Beweis. – Philip
http://meta.stackexchange.com/questions/32311/do-not-delete-duplicates – Flexo