【发布时间】:2023-03-21 07:35:01
【问题描述】:
我在IBM Swift Sandbox上写了一些短代码,遇到了一个令人困惑的问题
我试图获取数组元素的地址:
func printMemory(ptr: UnsafePointer<Int>){
print("At memory:\(ptr)")
}
var arr: [[Int]] = [
[0,1,2,3,4],
[0,1,2],
[0]
]
printMemory(&arr[0][0])
printMemory(&arr[1][0])
并且此代码的输出具有相同的地址。
通过将“UnsafePointer”更改为“UnsafeMutablePointer”可以解决这个问题,但我就是不知道为什么会这样。
为什么我一开始会得到相同的地址,而那个地址又是什么?
我遇到的另一个问题:
另外,如果我只将最后两行代码更改为:
printMemory(&arr[0])
printMemory(&arr[0][1])
编译将通过。
我预测我会得到一个错误,说 arr[0] 是 [Int] 类型与 UnsafePointer 中的 Int 类型不匹配。但没有警告。
而且,这两个地址相距很远。我无法解释为什么。
通过在 printMemory() 中使用“UnsafeMutablePointer”可以获得更接近的地址。
我想我需要解释一下为什么这个编译会通过以及为什么地址会这样。
抱歉我的英语语法不好,感谢您的每一个回复!
【问题讨论】:
-
FWIW,我看不到在 Linux 上使用
swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz的行为;它打印两个不同的地址。 -
对我来说看起来像一个错误,在 Xcode 7.3 操场上我看到不同的内存位置:
At memory:0x00007fff50d86070At memory:0x00007fff50d86058 -
我可以在编译项目中使用 Xcode 7.3 重现这一点。我假设该值被复制到相同的内存位置,因为它不能从函数中修改。
-
也许这个问题部分是这个网站上的一个小错误?我在另一个网站上尝试了这个短代码并得到了另一个结果。那么,第一个代码应该收到不同的地址吗?