Question about bridging void** and void* from C

I'm attempting to call this method from swift:

VkResult vkMapMemory(
    VkDevice                                    device,
    VkDeviceMemory                              memory,
    VkDeviceSize                                offset,
    VkDeviceSize                                size,
    VkMemoryMapFlags                            flags,
    void**                                      ppData);

which takes a pointer to a void pointer as the final argument, followed by memcpy:

void* memcpy( void* dest, const void* src, std::size_t count );

which takes a void pointer as the first argument.

On macOS, I'm able to pass a variable which is declared like so:

let dstPointer: UnsafeMutablePointer<UnsafeMutableRawPointer?> = UnsafeMutablePointer<UnsafeMutableRawPointer?>.allocate(capacity: 1)
vkMapMemory(..., dstPointer)
memcpy(dstPointer.pointee, ...)

However on Linux, this gives me an error on memcpy:

error: value of optional type 'UnsafeMutableRawPointer?' must be unwrapped to a value of type 'UnsafeMutableRawPointer'
        memcpy(dstPointer.pointee, rawBufferPointer.baseAddress!, Int(bufferSize))

I've tried changing the pointer to be non-optional, but this creates an issue on macOS when calling vkMapMemory:

Cannot convert value of type 'UnsafeMutablePointer<UnsafeMutableRawPointer>' to expected argument type 'UnsafeMutablePointer<UnsafeMutableRawPointer?>?'

Is there a reason these pointer types would be bridged differently on each platofrm? Also is there a better way of handling pointers to avoid this?

I don't know why it's different on different platforms, but I think the cleaner solution would be:

var dstPointer: UnsafeMutableRawPointer?
vkMapMemory(..., &dstPointer)
memcpy(!dstPointer, ...)

Yes this is much better thank you!