Wskaźnik arytmetyczny, gdy pustka ma nieznany rozmiar [zamknięty]

W Visual Studio C ++ w wersji 9 (i prawdopodobnie również w innych wersjach) następujący kod:

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

Generujete błędy:

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

Ten kod działa w GCC, który traktujesizeof(void) tak jak1.

Czy istnieje pewne ograniczenie tego ograniczenia, takie jak jawne rzucaniechar * dla celów arytmetyki wskaźnikowej dodaje zamieszania (void * jest dobrze rozpoznawany i używany jako wskaźnik bez pamięci do surowej pamięci).

Aktualizacja0Pamiętaj, że jestem świadomy istnienia standardu.I chcieć wykonać surową arytmetykę wskaźników.bioręsizeof(void) pokazać, że dobrze wiem, że tak nie jest1 jest przyczyną problemu.Przykładem kodu jest po prostu zademonstrowanie, co jest wymagane do wygenerowania błędów.Wiem, że nie jest to „normalny” sposób użyciavoid, ale to jest C i takie rzeczy się zdarzają.Tak, ludzie muszą to robić na niskim poziomie. Nie jestem po dlaczego, jestem po tym jak. Jeśli chcesz wiedzieć dlaczego, spójrz na niektóre źródła jądra lub przyjazny glibc.Aktualizacja1

Wydaje się, że to pytanie wywołało wiele zamieszania. Pytanie nie dotyczyczemu mającysizeof(void) == 1 nie jest standardem, ale co robić, gdy nie jest.

W przypadku, gdy ma zostać wykonana jednobajtowa arytmetyka wskaźnika, okazuje się, że rzutowanie nachar * jest poprawna odpowiedź, nie dlatego*(void *) nie ma rozmiaru, ale ponieważ standard faktycznie to gwarantuje*(char *) jest zawsze1. Dlatego wykorzystaniechar * jest zawsze poprawny i zgodny zvoid * z rozszerzeniem GCC dla celów arytmetycznych wskaźnika surowego.

Aby jeszcze bardziej wzmocnić ten punkt,void * jest właściwym wyborem dla wskaźników do pamięci bez typów ichar * jest właściwym typem do rzutowaniadla surowej arytmetyki wskaźników.

questionAnswers(7)

yourAnswerToTheQuestion