如何在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将丢失地址的最高有效位