OCaml strings consist of arbitrary sequences of bytes and may contain embedded NULLs. In particular they are not terminated with NULL, so you will need to add those by hand on the C side.
This is unsafe: you need to register the result of caml_copy_string as a GC root before calling the OCaml callback. Otherwise if the GC runs before you use that value (inside the callback), the value may be moved in the OCaml heap but the pointer won’t be updated and it will be left dangling.
As mentioned here you need to make space for the trailing NULL, so you must allocate caml_string_length(s) + 1 bytes, and instead of using strcopy you need to use something like memcpy.
Hope it helps,
Nicolas