有几条说明如何将字符串转换为CString,以便在使用FFI调用C时传递。我的问题是将字符串列表转换为char **word
值,我无法在stackoverflow或hackage中找到答案。
我看到一个选项:我可以使用newCString
转换列表中的每个字符串,然后将它们提供给newArray - 不要忘记释放保留的内存。
我想这个相对常见的操作应该有更好的选择吗?
答案 0 :(得分:4)
不,我认为没有任何事情要做。 newCString
和newArray
已经足够简单了:
import Foreign.Ptr
import Foreign.C.String
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
makeCStringArray :: [[String]] -> IO (Ptr CString)
makeCStringArray arr = newArray =<< traverse newCString arr
freeCStringArray :: Int -> Ptr CString -> IO ()
freeCStringArray n ptr = do
strs <- peekArray n ptr
traverse free strs
free ptr