Certainly it isn't the most attractive solution - still it is possible and works well.
When it comes to moving things across FFI barrier, that is also very possible as there are all kinds of types (including stable pointers) in the Foreign.* modules that map onto C types.