sizeof
- это мера в символах, поэтому вы можете сделать это:
void *start_of_sixth_element = ((char*)item) + (5 * element_size);
Кто-то, кто знает тип каждого элемента, может затем привести start_of_sixth_element
к правильному типу, чтобы использовать его.
void*
- плохой выбор, поскольку арифметику указателей нельзя использовать с указателями void*
в стандартном C (для этого есть расширение GNU, но для переносимого кода вы используете char*
или unsigned char*
хотя бы для арифметики).
Код, который знает правильный тип до применения смещения 5, может просто сделать это:
correct_type *sixth_element = ((correct_type *)item) + 5;
void не является типом
Это тип, это просто не "полный тип". «Неполный тип» в значительной степени означает, что компилятор не знает, на что действительно указывает void*
.