如何在OCaml中打印内存地址?

如何在OCaml中打印内存地址?,ocaml,Ocaml,假设我有一个变量: let a = ref 3 in magic_code Magic_代码应打印存储在a中的内存地址。有这样的事吗?我在谷歌上搜索了一下,但什么也没找到……这应该可以: 设a=ref 3 in 设地址=2*(Obj.magic a)in Printf.Printf“%d”地址;; OCaml使用字的最低有效位区分堆指针和整数,0表示指针,1表示整数(请参见现实世界的OCaml) Obj.magic是一种类型为'a->'b的函数,允许您绕过键入(即任意“强制转换”)。如果通过

假设我有一个变量:

let a = ref 3 in magic_code
Magic_代码应打印存储在
a
中的内存地址。有这样的事吗?我在谷歌上搜索了一下,但什么也没找到……

这应该可以:

设a=ref 3 in
设地址=2*(Obj.magic a)in
Printf.Printf“%d”地址;;
OCaml使用字的最低有效位区分堆指针和整数,0表示指针,1表示整数(请参见现实世界的OCaml)

Obj.magic
是一种类型为
'a->'b
的函数,允许您绕过键入(即任意“强制转换”)。如果通过
Obj.magic
不安全地强制OCaml将引用转换为
int
,则得到的值是地址右移一位。要获得实际内存地址,需要将其向后移动1位,即值的两倍


也可以看到这一点。

在OCaml的安全部分不能这样做。此外,由于垃圾收集,事物的地址一直在变化。你为什么想知道地址?我明白了。用于调试目的。@bigollo:您可以使用
=
查看两个变量是否指向同一个对象=。除此之外,你无能为力。是的,我知道。我想您必须欣赏ocaml的抽象。如果您不想放弃上述声明,请了解
Obj
模块。如果您不顾一切地想使用它进行调试,那么设置一个大堆可能有助于避免GC启动。我不是下选程序,但我认为代码会将该值解释为OCaml int(左移一位),因此您需要将其加倍以恢复实际指针。显然,这是一个巨大且不可靠的黑客攻击,只在紧急情况下用于调试。
Obj.magic
Obj.repr
Obj.Obj
都是作为身份函数实现的。他们唯一不同的是他们的类型
Obj.magic
已经是一个从任何类型到任何类型的函数。因此,
Obj.repr
是不必要的。将其乘以2将丢失地址的最高有效位