Memory 如何在Haskell中获取指针值?

Memory 如何在Haskell中获取指针值?,memory,pointers,haskell,Memory,Pointers,Haskell,我希望在一个非常低的水平上操作数据 因此,我有一个函数,它接收一个作为整数的虚拟内存地址,并用这个内存地址“填充”。我从C接口这个函数,所以它的类型是(CUInt->a)。 我要链接的内存是文件中的Word8。遗憾的是,我不知道如何访问该Word8的指针值 为了清楚起见,我不需要Word8的值,我需要虚拟内存地址的值,这是指向它的指针的值。您可能正在寻找,并且可能要将其作为提示 请注意,CUInt不能表示所有平台上的指针。为了简单的示例,假设您要向指针添加偏移量 前沿问题: module Mai

我希望在一个非常低的水平上操作数据

因此,我有一个函数,它接收一个作为整数的虚拟内存地址,并用这个内存地址“填充”。我从C接口这个函数,所以它的类型是
(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')