
Hi, I'm trying to learn about Haskell's FFI (running 6.0.1 on linux) and see the following weird behavior with ghci:
You're seeing the right behaviour.
Shouldn't "sizeOf nullPtr" return an error? And sizeOf a Ptr Word64 should be 8 I think.
The size of a Word64 value is 8 but the size of a pointer is always the same no matter what the pointer points to. Since most machines have 32-bit addresses, the size of a pointer will be 4 on most machines. A null pointer is just another machine address and has to be the same size as any other machine address so, again, it has to be the same size.
Also this program prints "4", when it seems it should print "8":
module Main where import Data.Word import Foreign.Storable import Foreign.Ptr import Foreign.StablePtr
x :: Word64 x = 5
main = do x_sptr <- newStablePtr 5 putStrLn $ show $ sizeOf x_sptr
This is a stable pointer to an Int. Again, the type and, in particular, the size of the thing pointed to is irrelevant. I can't be bothered looking it up but the size returned is either the size of a machine address (void* in C) or the size of int in C. Either way it is 4 on most machines. It looks like you intended to create a stable pointer to x which is a Word64. This would not have affected the result. Indeed, you could have created a stable pointer to a complex Haskell data structure like a binary tree or a function (i.e., something the FFI doesn't directly support) and the size would still be the same because all you are doing is passing a pointer to the object. -- Alastair Reid www.haskell-consulting.com