Solidity
在 Solidity 中聲明儲存指針的記憶體數組
我想將一個變數聲明為指向儲存數組的指針的記憶體數組
uint256
。例如:
pragma solidity ^0.4.24; contract A { uint256[] public array0; uint256[] public array1; constructor () public { array0.push(123); array1.push(456); } function test() public { uint256[][] memory storageArrays = new uint256[][](2); storageArrays[0] = array0; storageArrays[1] = array1; storageArrays[0][0]++; storageArrays[1][0]--; } }
我希望這改變 and 的值
array0
,array1
但它們不會改變,因為儲存數組被隱式複製到記憶體中。此程式碼僅更改其在記憶體中的副本。這是因為數組的兩個維度都設置為
memory
。我希望數組的第一個維度是storage
,第二個維度memory
我試圖這樣聲明
storageArrays
:uint256[] storage [] memory storageArrays = new uint256[][](2);
但它給出了這個語法錯誤:
ParserError: Expected identifier but got '[' uint256[] storage [] memory storageArrays = new uint256[][](2); ^
是否可以?如果是這樣,怎麼做?提前致謝。
Solidity 故意不支持記憶體指針“a la C”,也沒有任何指針算法。這意味著遞增或遞減指針變數不是有意義的操作。你可以在彙編中做類似的事情,但你必須在盡可能低的級別管理整個事情,而不是考慮能夠為任何未來版本的乙太坊協議同步solidity變數和彙編變數。
我知道您想將儲存指針放入記憶體數組(
storageArrays[0] = array0
)中,以便以後可以更有效地更新儲存值……不幸的是,對這些記憶體數組中儲存指針的引用
storageArrays[0 or 1]
基本上是一個記憶體副本,以及對該副本本身的任何更新,這就是為什麼您只會看到storageArrays
記憶體變化中uint 值的遞增和遞減變化.就我而言,這是不可能的……實際上,臨時數據(記憶體)能夠指向和更改硬碟儲存中的任何數據,這實際上會帶來安全風險。
至少在 Solidity 中,情況似乎如此。