2016-05-06 47 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」可以解決這個問題,但我不知道爲什麼會發生這種情況。
爲什麼我首先得到相同的地址,以及佔用那個地址的地址?

另一個問題我遇到:

另外,如果我只代碼的最後兩行更改爲:

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

的編譯會通過。
我預測我會得到一個錯誤,說arr [0]是[Int]類型與UnsafePointer中的Int類型不匹配。但沒有任何警告。
另外,這兩個地址彼此距離很遠。我無法解釋爲什麼。
通過使用printMemory()中的「UnsafeMutablePointer」可以獲得更近的地址。
我想我需要解釋爲什麼這個編譯會通過,爲什麼地址就像這樣。

對不起,我的英語語法不好,謝謝你的回覆!

+1

FWIW,我在Linux上看不到使用'swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz'的行爲;它打印兩個不同的地址。 –

+0

看起來像一個bug,在Xcode 7.3遊樂場我看到不同的內存位置:'在內存:0x00007fff50d86070''在內存:0x00007fff50d86058' – JAL

+1

我可以在編譯的項目中使用Xcode 7.3重現此操作。我*假設*該值被複制到相同的內存位置,因爲它不能從該函數修改。 –

回答

-1

要回答你的第一個問題: 最有可能的編譯器實現的共同元素的數組之間共享,並提出只有一個存儲陣列,[0,1,2,3,4],兩片充當[0,1,2][0]沒有實際需要,讓他們在內存中冗餘。

+1

您可以通過更改指定的值來測試它們,使它們都是唯一的。 –

+0

不幸的是,'var arr = [[0,1,2,3,4],[5,6,7],[8]]'... –

+0

也是這樣......這很有趣。 – Alexander