Указатели не владеют тем, на что они указывают, поэтому, когда вы делаете это:
let p1 : *const u8 = vec![17u8,2u8].as_ptr();
последовательность событий, которая происходит, будет следующей:
- A
Vec
is построенный, с буфером, выделенным в куче, вызывается as_ptr()
, возвращающий указатель на буфер Vec
отбрасывается, потому что ничто не владеет им, поэтому буфер освобождается - Когда вы позже разыменовываете указатель, вы вызываете Undefined Behavior
Второй случай работает правильно:
let p2 : *const u8 = "123".as_ptr();
потому что «123» - это строковый литерал и строковые литералы имеют 'static
время жизни - они действуют столько же, сколько и сама программа.