Solidity

為什麼函式中聲明的數組預設引用儲存點 0?

  • June 18, 2018

根據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;
   }
}

另一篇文章中,使用者smarx指出:

“當你聲明一個儲存變數時,它本質上是對儲存中某個位置的引用。在你將它分配給某個東西之前,它指向位置 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 中。

引用自:https://ethereum.stackexchange.com/questions/51454