2016-05-06 4 views
4

私は配列要素のアドレスを取得しようとしました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がこのように振る舞うのかを説明する必要があると思います。

私の悪い英語文法に感謝し、すべての返信のおかげで申し訳ありません!

+1

FWIW、Linuxで 'swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz'を使用しても動作しません。 2つの異なるアドレスを出力します。 –

+0

Xcode 7.3のプレイグラウンドでバグのように見えます。異なるメモリ位置を見ています: 'At memory:0x00007fff50d86070'' At memory:0x00007fff50d86058' – JAL

+1

これはXcode 7.3でコンパイルされたプロジェクトで再現できます。私は、関数から変更することができないので、値が同じメモリ位置にコピーされると仮定します。 –

答えて

-1

あなたの最初の質問に答えるために: ほとんどの場合は、コンパイラは、それらの配列の間で共有される共通の要素を実現し、実際にそれらを維持する必要がなく[0,1,2][0]として機能するように一つだけのメモリ内の配列、[0,1,2,3,4]、そして2つのスライスを作りましたメモリに重複しています。

+1

割り当てられた値をすべて一意になるように変更して、テストすることができます。 –

+0

残念ながら、同じことが 'var arr = [[0,1,2,3,4]、[5,6,7]、[8]]' ... –

+0

で起こります。 – Alexander

関連する問題