I don’t know how Go’s internals work, but here’s a guess:
Based on the deferred free of the callSig_ptr string pointer, it looks to me like both callSig and argv are not supposed to live after the call to (*MqC).Send, but the Go compiler doesn’t know that. It just sees that you’re passing the address of a local parameter (argv) into C and that value might be supposed to live past the call to gomsgque_Send.
If gomsgque_Send stored a reference to &argv somewhere in the "C world," then (*MqC).Send returned, then a garbage collection ran (cleaning up the argv that escaped to the heap in the call to (*MqC).Send), when atomSet is eventually called, it would crash with a segmentation fault because argv was cleaned up.
If the lifetimes of callSig and argv don’t need to survive after gomsgque_Send returns, try getting the address outside of the call to gomsgque_Send to something like this: