Out if curiosity I've checked what c2rust.com thinks about it:
**(*(p as *mut [*mut libc::c_int; 0])).as_mut_ptr() = 1 as libc::c_int;
which is still needlessly complicated, and not even quite accurate due to giving the array a 0 size (the as_mut_ptr() converts the array back to a C pointer).
>and not even quite accurate due to giving the array a 0 size (the as_mut_ptr() converts the array back to a C pointer).
It doesn't seem inaccurate to me, more like the best choice at hand. If the C array has a known length, the Rust code has it too. Only if the C code has an array of unknown length does the Rust code use a 0-length array. Furthermore, if the C code indexes the array of unknown length, the Rust code uses .as_mut_ptr().offset(...) instead of directly indexing the array. So the fact that it represents C arrays of unknown length with Rust arrays of 0 length does not cause any problem, because the generated code is consistent.