2016-05-06 16 views
4

Ich schrieb einige kurze Codes auf IBM Swift Sandbox und traf ein verwirrendes ProblemSwift - Adresse von Array-Elemente

Ich habe versucht, Adressen von Array-Elemente zu erhalten:

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]) 

und der Ausgang dieses Codes hat die gleichen Adressen.
Die Änderung von "UnsafePointer" zu "UnsafeMutablePointer" würde dieses Problem lösen, aber ich weiß einfach nicht, warum dies geschieht.
Warum bekomme ich zuerst die gleiche Adresse und was belegt diese Adresse?

Ein weiteres Problem, das ich traf:

Auch, wenn ich nur die letzten beiden Zeilen Code ändern:

printMemory(&arr[0]) 
printMemory(&arr[0][1]) 

Die Kompilierung passiert.
Ich sage voraus, dass ich einen Fehler erhalten würde, der besagt, dass arr [0] vom Typ [Int] nicht Int-Typ in UnsafePointer passt. Aber es gibt keine Warnung.
Auch die beiden Adressen sind weit voneinander entfernt. Ich kann nicht erklären warum.
Durch die Verwendung von "UnsafeMutablePointer" in printMemory() würde nähere Adressen erhalten.
Ich denke, ich brauche eine Erklärung, warum diese Kompilierung passieren würde und warum Adresse so agieren.

Entschuldigung für meine schlechte englische Grammatik und danke für jede Antwort!

+1

FWIW, ich sehe dieses Verhalten nicht mit 'swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz' auf Linux; Es druckt zwei verschiedene Adressen. –

+0

Sieht aus wie ein Fehler für mich, in einem Xcode 7.3 Spielplatz sehe ich verschiedene Speicherplätze: 'Im Speicher: 0x00007fff50d86070'' Im Speicher: 0x00007fff50d86058' – JAL

+1

Ich kann dies mit Xcode 7.3 in einem kompilierten Projekt reproduzieren. Ich gehe davon aus, * dass der Wert an den gleichen Speicherort kopiert wird, da er nicht von der Funktion geändert werden kann. –

Antwort

-1

Ihre erste Frage zu beantworten: wahrscheinlich die meisten, erkannte der Compiler die gemeinsamen Elemente unter den Arrays gemeinsam genutzt, und nur ein Array im Speicher, [0,1,2,3,4], und zwei Scheiben zu wirken als [0,1,2] und [0] ohne tatsächlich zu benötigen, um sie gemacht redundant im Speicher.

+1

Sie könnten das testen, indem Sie die zugewiesenen Werte ändern, sodass sie alle eindeutig sind. –

+0

Leider passiert das gleiche mit 'var arr = [[0,1,2,3,4], [5,6,7], [8]]' ... –

+0

Das ist ... interessant. – Alexander