Memory 如何在Haskell中获取指针值?
我希望在一个非常低的水平上操作数据 因此,我有一个函数,它接收一个作为整数的虚拟内存地址,并用这个内存地址“填充”。我从C接口这个函数,所以它的类型是Memory 如何在Haskell中获取指针值?,memory,pointers,haskell,Memory,Pointers,Haskell,我希望在一个非常低的水平上操作数据 因此,我有一个函数,它接收一个作为整数的虚拟内存地址,并用这个内存地址“填充”。我从C接口这个函数,所以它的类型是(CUInt->a)。 我要链接的内存是文件中的Word8。遗憾的是,我不知道如何访问该Word8的指针值 为了清楚起见,我不需要Word8的值,我需要虚拟内存地址的值,这是指向它的指针的值。您可能正在寻找,并且可能要将其作为提示 请注意,CUInt不能表示所有平台上的指针。为了简单的示例,假设您要向指针添加偏移量 前沿问题: module Mai
(CUInt->a)
。
我要链接的内存是文件中的Word8
。遗憾的是,我不知道如何访问该Word8
的指针值
为了清楚起见,我不需要Word8的值,我需要虚拟内存地址的值,这是指向它的指针的值。您可能正在寻找,并且可能要将其作为提示
请注意,CUInt不能表示所有平台上的指针。为了简单的示例,假设您要向指针添加偏移量 前沿问题:
module Main where
import Control.Monad (forM_)
import Data.Char (chr)
import Data.Word (Word8)
import Foreign.ForeignPtr (ForeignPtr, withForeignPtr)
import Foreign.Ptr (Ptr, plusPtr)
import Foreign.Storable (peek)
import System.IO.MMap (Mode(ReadOnly), mmapFileForeignPtr)
是的,您写道您不想要Word8
的值,但我已经用peek
检索了它,以证明指针是有效的。您可能想从内部返回Ptr
,但文档警告:
请注意,从操作返回指针并在操作完成后使用它是不安全的。指针的所有用法都应在带foreignptr的括号内。此不安全的原因与以下相同:终结器可能比预期运行得更早,因为编译器只能跟踪ForeignPtr
对象的使用情况,而不能跟踪由其生成的Ptr
对象
代码很简单:
doStuff :: ForeignPtr Word8 -> Int -> IO ()
doStuff fp i =
withForeignPtr fp $ \p -> do
let addr = p `plusPtr` i
val <- peek addr :: IO Word8
print (addr, val, chr $ fromIntegral val)
输出:
(0x00007f1b40edd000,71,'G')
(0x00007f1b40edd001,117,'u')
(0x00007f1b40edd002,116,'t')
(0x00007f1b40edd003,101,'e')
(0x00007f1b40edd004,110,'n')
(0x00007f1b40edd005,32,' ')
(0x00007f1b40edd006,77,'M')
(0x00007f1b40edd007,111,'o')
(0x00007f1b40edd008,114,'r')
(0x00007f1b40edd009,103,'g')
(0x00007f1b40edd00a,101,'e')
(0x00007f1b40edd00b,110,'n')
(0x00007f1b40edd00c,33,'!')
(0x00007f1b40edd00d,10,'\n')
(0x00007f1b40edd000,71,'G')
(0x00007F1B40EDD001117,'u')
(0x00007F1B40EDD002116,'t')
(0x00007F1B40EDD003101,'e')
(0x00007F1B40EDD004110,'n')
(0x00007f1b40edd005,32')
(0x00007f1b40edd006,77,'M')
(0x00007F1B40EDD007111,“o”)
(0x00007F1B40EDD008114,'r')
(0x00007f1b40edd009103,'g')
(0x00007f1b40edd00a,101,'e')
(0x00007f1b40edd00b,110,'n')
(0x00007f1b40edd00c,33,!)
(0x00007f1b40edd00d,10,“\n”)您不能在C中创建一个函数来取消对指针的引用吗?
(0x00007f1b40edd000,71,'G')
(0x00007f1b40edd001,117,'u')
(0x00007f1b40edd002,116,'t')
(0x00007f1b40edd003,101,'e')
(0x00007f1b40edd004,110,'n')
(0x00007f1b40edd005,32,' ')
(0x00007f1b40edd006,77,'M')
(0x00007f1b40edd007,111,'o')
(0x00007f1b40edd008,114,'r')
(0x00007f1b40edd009,103,'g')
(0x00007f1b40edd00a,101,'e')
(0x00007f1b40edd00b,110,'n')
(0x00007f1b40edd00c,33,'!')
(0x00007f1b40edd00d,10,'\n')