Арифметика указателя, когда пустота имеет неизвестный размер [закрыто]
В Visual Studio C ++ версии 9 (и, возможно, в других версиях) следующий код:
int a = sizeof(void);
void const *b = static_cast<void const *>("hello world");
b += 6;
error C2070: 'void': illegal sizeof operand
error C2036: 'const void *' : unknown size
Этот код работает под GCC, который лечитsizeof(void)
как1
.
Есть ли способ обойти это ограничение, так как приведение явно кchar *
в целях указателя арифметика добавляет путаницы (void *
хорошо распознается и используется как указатель на типизированную память).
sizeof(void)
чтобы показать, что я хорошо осознаю тот факт, что это не так1
является причиной проблемы.Пример кода просто демонстрирует, что требуется для генерации ошибок.Я знаю, что это не "нормальный" способ использованияvoid
, но это С, и такие вещи случаются.Да, люди должны делать это на низком уровне. Я не после того, почему, я после того, как. Если вы хотите знать почему, взгляните на какой-нибудь исходный код ядра или ваш дружественный glibc.Update1Кажется, этот вопрос породил много путаницы. Вопрос не оПочему имеющийsizeof(void) == 1
это не стандартно, но что делать, когда это не так.
В случае, когда должна выполняться арифметика однобайтового указателя, оказывается, что приведение кchar *
правильный ответ, не потому что*(void *)
не имеет размера, но потому что стандарт фактически гарантирует, что*(char *)
является всегда1
, Поэтому использованиеchar *
всегда правильно и соответствуетvoid *
с расширением GCC для арифметики необработанных указателей.
Чтобы еще больше подчеркнутьvoid *
является правильным выбором для указателей на типизированную память, иchar *
правильный тип для приведениядля арифметики необработанных указателей.