【问题标题】:Swift -- address of Array elementsSwift——数组元素的地址
【发布时间】: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 重现这一点。我假设该值被复制到相同的内存位置,因为它不能从函数中修改。
  • 也许这个问题部分是这个网站上的一个小错误?我在另一个网站上尝试了这个短代码并得到了另一个结果。那么,第一个代码应该收到不同的地址吗?

标签: arrays swift


【解决方案1】:

回答您的第一个问题: 最有可能的是,编译器实现了这些数组之间共享的公共元素,并且只在内存中创建了一个数组[0,1,2,3,4],以及两个切片作为[0,1,2][0],而实际上不需要将它们冗余地保留在内存中。

【讨论】:

  • 您可以通过更改分配的值来测试它,以便它们都是唯一的。
  • 这……很有趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多