Crystal中无法获取二维数组元素地址的问题咨询
关于Crystal中无法取二维数组元素地址的问题分析
错误原因
编译器报错 can't take address of @map[x][y] 的核心逻辑是:
pointerof仅支持获取左值的内存地址,比如实例变量、局部变量、类变量或结构体字段——这些都是直接绑定到固定内存位置的可赋值目标。@map[x][y]是一个复合表达式:它先通过@map[x]获取内层数组,再调用该数组的[]方法返回对应位置的Room引用。这个返回的引用是临时值,并非直接对应内存中固定位置的左值,因此不符合pointerof的使用要求。
解决方案
要获取二维数组中元素的指针,可利用 Crystal 数组的 to_unsafe 方法直接获取底层内存指针,再通过索引计算偏移:
def map_ptr(x : Int32, y : Int32) : Pointer(Room) # 获取内层数组的底层指针,并转换为 Room 类型的指针 inner_ptr = @map[x].to_unsafe.as(Pointer(Room)) # 偏移 y 个元素的位置,得到目标 Room 的指针 inner_ptr + y end
补充说明
你参考的规范中,pointerof(@foo) 合法是因为实例变量是对象内存中固定的存储位置,属于左值,直接对应内存地址。而数组索引操作是方法调用的结果,返回的是临时值,无法被 pointerof 直接处理。
内容的提问来源于stack exchange,提问作者siery
相关产品推荐
相关产品推荐

