将字符串列表转换为haskell中的c数组

时间:2017-04-22 16:51:33

标签: haskell ghc ffi

有几条说明如何将字符串转换为CString,以便在使用FFI调用C时传递。我的问题是将字符串列表转换为char **word值,我无法在stackoverflow或hackage中找到答案。

我看到一个选项:我可以使用newCString转换列表中的每个字符串,然后将它们提供给newArray - 不要忘记释放保留的内存。

我想这个相对常见的操作应该有更好的选择吗?

1 个答案:

答案 0 :(得分:4)

不,我认为没有任何事情要做。 newCStringnewArray已经足够简单了:

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