Приведение необходимо, так как то, что вы делаете, является формой наказания типа: вы переосмысливаете память, на которую указывает от char *
до void *
.
Для этих типов стандарт C гарантирует, что это действительно работает, так как char *
и void *
имеют одинаковое представление. Для других комбинаций типов это может быть не так.
Соответствующими частями стандарта являются раздел 6.2.5, §27
.
Указатель на void должен иметь такой же
представление и выравнивание
требования в качестве указателя на
тип персонажа. Аналогично, указатели
к квалифицированным или неквалифицированным версиям
совместимых типов должны иметь
такое же представление и выравнивание
требования. Все указатели на
типы конструкций должны быть одинаковыми
представление и выравнивание
требования как друг к другу. Все
указатели на типы объединений должны иметь
такое же представление и выравнивание
требования как друг к другу. указатели
для других типов не нужно иметь то же самое
представление или выравнивание
требования.
и менее актуален (но, возможно, также интересен) раздел 6.3.2.3, §7
Указатель на объект или неполный
тип может быть преобразован в указатель на
другой объект или неполный тип.
Если результирующий указатель не
правильно выровнен для
тип, поведение не определено.
В противном случае, когда преобразуется обратно,
результат должен сравниваться равным
оригинальный указатель Когда указатель на
Объект преобразуется в указатель на
тип символа, результат указывает на
младший адресуемый байт
объект. Последовательные приращения
результат, вплоть до размера объекта,
указатели на оставшиеся байты
объекта.
Все остальное зависит от реализации.