私は配列要素のアドレスを取得しようとしました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"に変更すると、この問題は解決しますが、なぜこれが起こるのか分かりません。
なぜ私は最初に同じアドレスを取得し、そのアドレスを占有するのですか?
もう一つの問題は、私が会った:私だけに、コードの最後の2行を変更した場合また
、:
printMemory(&arr[0])
printMemory(&arr[0][1])
コンパイルが通過します。
ars [0]がUnsafePointerのInt型と一致しないというエラーが発生すると予測します。しかし、警告はありません。
また、2つのアドレスは互いに遠く離れています。理由を説明できません。
printMemory()で "UnsafeMutablePointer"を使用すると、より近いアドレスが得られます。
私はこのコンパイルがなぜ合格するのか、なぜaddressがこのように振る舞うのかを説明する必要があると思います。
私の悪い英語文法に感謝し、すべての返信のおかげで申し訳ありません!
FWIW、Linuxで 'swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz'を使用しても動作しません。 2つの異なるアドレスを出力します。 –
Xcode 7.3のプレイグラウンドでバグのように見えます。異なるメモリ位置を見ています: 'At memory:0x00007fff50d86070'' At memory:0x00007fff50d86058' – JAL
これはXcode 7.3でコンパイルされたプロジェクトで再現できます。私は、関数から変更することができないので、値が同じメモリ位置にコピーされると仮定します。 –