Есть указатель на область памяти, я не могу её инициализировать т.к. она слишком велика, вместо этого я буду инициализировать элементы отдельно, когда придёт время.
Я хочу создать слайс из этого указателя с помощью slice::from_raw_parts_mut(), но создание ссылочного типа на неинициализированную память это UB. Как сделать это правильно?
Вот такой массив указателей я хочу сделать: &mut [*mut State]
Я решил использовать MaybeUninit: &mut [MaybeUninit<*mut State>]
Но я не знаю будет ли это работать, поскольку сами элементы MaybeUninit не инициализированы с помощью MaybeUninit::uninit()
MaybeUninit под капотом - это union, то есть компилятор ничего не знает, инициализированное там значение или нет и перекладывает эту ответственность на программиста. А значит UB здесь не будет.
То есть спокойно делаете &mut [MaybeUninit<*mut State>], инициализируете элементы и после std::mem::transmute в &mut [*mut State]
Имя, с одной стороны для сырого указателя валидно указывать куда угодно, с другой не валидно объявлять неинициализированную память как инициализированную, кто его знает что сломают оптимизации компилятора (и будет UB), но на деле скорее всего ничего не сломается.
Если это память выданная аллокатором, то с большой вероятностью там будут нули (для сырого указателя это будет нулевой указатель), но может быть и мусор. Если память со стека, то там скорее всего будет мусор.