Creating mutable structs and `GC.@preserve`ing them is an effective means of getting stack allocated memory, so long as the structs do not escape.
E.g., I occasionally follow this approach:
mem = Ref{NTuple{32,Float64}}()
GC.@preserve mem begin
p = Base.unsafe_convert(Ptr{Float64}, mem)
# do things with p, e.g. pass it to a C library
endNo comments yet.