Powiel możliwe:
What is the size of void?Dlaczego sizeof (void) == 1?
W §6.2.5.19 prorocy niech nam wiedzieć, że:
Typ
void
obejmuje pusty zbiór wartości
The n dlaczego sizeof(void)
daje 1, gdy 0 wydaje się wystarczać?
Powiel możliwe:
What is the size of void?Dlaczego sizeof (void) == 1?
W §6.2.5.19 prorocy niech nam wiedzieć, że:
Typ
void
obejmuje pusty zbiór wartości
The n dlaczego sizeof(void)
daje 1, gdy 0 wydaje się wystarczać?
sizeof(void)
nie opracowania w kompilator C.
ISO 9899: 2011 6.2.5/19
"Typ pustki zawiera pusty zbiór wartości, jest to niekompletny obiekt typu , którego nie można ukończyć."
ISO 9899: 2011 6.5.3.4/1
"Operator sizeof nie stosuje się do wyrażenia, które ma typ funkcji lub niekompletne typu"
To jest tekst normatywny : sizeof (void) nie jest prawidłowy C.
... a mimo to kompiluje się z gcc, ponieważ jest rozszerzeniem gcc. : //gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith – Philip
Zastanawiam się, jak to odpowiada na pytanie OP ... – ThiefMaster
@Philip Tak, rzeczywiście, ale będzie nie kompiluje się na zgodnej implementacji kompilatora C. – Lundin
Jest to rozszerzenie gcc: http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith
W GNU C, operacje dodawania i odejmowania są obsługiwane na wskaźniki do
void
i wskaźniki do funkcji. Odbywa się to poprzez traktowanie wielkościvoid
lub funkcji jako 1.Konsekwencją tego jest fakt,
sizeof
jest również akceptowane navoid
oraz rodzajów czynności i zwraca 1.Opcja
-Wpointer-arith
wnioski ostrzeżenie, jeśli te rozszerzenia są używane.
Powodem void
potrzebuje wielkości do wykonywania takich arytmetyki jest ptr - ptr2
faktycznie nie daje różnicę numerycznych adresów ale liczbę elementów oba wskaźniki są od siebie - a wielkość elementu wskazywanego przez void *ptr
jest sizeof(*ptr)
, który jest sizeof(void)
.
Jeśli to jest rozszerzenie, dlaczego 'gcc -std = c99 -pedantic' daje sizeof (void) == 1? -pedantic wyświetla ostrzeżenie o używaniu sizeof na pustym typie, ale kod kompiluje i drukuje 1. – Lundin
@Lundin: ponieważ użyłeś '-pedantic', a nie' -pedantic-errors'' – Christoph
@Christoph Moim zdaniem, powinno być wystarczające do ustawienia flagi -std = c99, a następnie nie powinno pozwolić nawet na kompilowanie kodu bez błędów. – Lundin
Prawdopodobnie używasz gcc lub jakiegoś innego kompilatora, który robi to jako rozszerzenie (w C, sizeof (void) jest nieprawidłowe).
gcc mówi:
W GNU C, operacje dodawania i odejmowania są obsługiwane na wskaźniki do unieważnienia i wskaźniki do funkcji. Odbywa się to poprzez traktowanie wielkości próżni lub funkcji jako 1.
Konsekwencją tego jest, że sizeof jest również akceptowane na nieważne i na typów funkcji i zwraca 1.
Opcja -Wpointer-arith żąda ostrzeżenia, jeśli te rozszerzenia są używane.
... i jest nieważny z powodu § 6.5.3.1.1: "Operator sizeof nie zostanie zastosowany do wyrażenia, które ma typ funkcji lub niekompletnego typu , do nazwy rodzicielskiej tego typu lub do wyrażenie określające element pola bitowego "oraz §6.2.5.19:" void "jest" niekompletnym typem, którego nie można zakończyć. " – Philip
http://stackoverflow.com/questions/1666224/what-is-the-size-of-void –
Istnieje różnica między tym pytaniem a jego starszym duplikatem: ten jest zaakceptowana odpowiedź zawiera ac dowód tual. – Philip
http://meta.stackexchange.com/questions/32311/do-not-delete-duplicates – Flexo