Solidity
為什麼函式中聲明的數組預設引用儲存點 0?
根據Solidity Documentation,對於以下程式碼,
“…編譯器將 x 解釋為儲存指針,並將使其預設指向儲存槽 0。這會導致 someVariable(位於儲存槽 0)被 x.push(2) 修改”。
/// THIS CONTRACT CONTAINS AN ERROR pragma solidity ^0.4.0; contract C { uint someVariable; uint[] data; function f() public { uint[] x; x.push(2); data = x; } }
“當你聲明一個儲存變數時,它本質上是對儲存中某個位置的引用。在你將它分配給某個東西之前,它指向位置 0,這也恰好是第一個聲明的狀態變數的位置(在本例中為 a) .你基本上是在使用一個未初始化的指針”。
然而,讓我感到困惑的是,如果“uint
$$ $$x" 指向 0,“someVariable” 所在的位置,不會是"uint$$ $$data”也是這樣?這兩個數組不是都沒有初始化嗎?如果“data”佔用slot 1,“x”不就只佔用slot 2嗎? 我的猜測是,當它在函式中時,它又從 0 開始,假設所有內容都將保存到記憶體中,但是我希望在函式中聲明的數組預設引用記憶體。
然而,讓我感到困惑的是,如果
uint [] x
指向 0,someVariable
它所在的位置,不會uint[] data
做同樣的事情嗎?不,
data
將指向位置 1。這兩個數組不是都未初始化嗎?
是的,但是第二個指向一個未初始化的儲存位置,預設為 0(因為儲存不是動態分配的)。根據文件:
局部變數 x 的類型是 uint
$$ $$儲存,但由於儲存不是動態分配的,因此必須從狀態變數中分配它才能使用。因此,不會為 x 分配儲存空間,而是僅用作儲存中預先存在的變數的別名。
.
如果
data
占用slot 1,會不會x
只佔用slot 3?不,因為不是動態分配的。但如果動態分配,它的引用將儲存在插槽 2 而不是 3 中。