Solidity

分配一個數組是創建一個指針還是複制一個數組?(堅固)

  • April 19, 2022

這是程式碼:

pragma solidity^0.4.16;

contract Test {

   struct SomeData {
       address[] users;
   }

   address[] nullArray;
   mapping(uint => SomeData) SomeDataList;

   function insertData(uint number) {
       SomeDataList[number] = SomeData({
           users : nullArray
       });

       SomeDataList[number].users.push(msg.sender);
   }

}

insertData函式中,我初始化一個新結構並分配nullArrayusers欄位(users現在儲存它的副本nullArray或指向它的指針?)。之後,我將一些數據推送到這個結構中,我不確定全域變數是否nullArray會受到影響。

使用者現在儲存 nullArray 的副本還是指向它的指針?

它將創建一個獨立的副本。據我了解,因為nullArraySomeDataList都是狀態變數,所以會有兩個獨立的副本。

這裡的solidity docs中提到,

儲存和記憶體之間以及狀態變數甚至來自其他狀態變數)之間的分配總是創建一個獨立的副本。

因此,

我將一些數據推送到這個結構中,我不確定全域變數 nullArray 是否會受到影響

nullArray不會受到影響。

更新

我在Remix-IDE中使用一些附加功能嘗試了您的程式碼,如下所示,

pragma solidity^0.4.16;

contract Test {

   struct SomeData {
       address[] users;
   }

   address[] nullArray;
   mapping(uint => SomeData) SomeDataList;

   function insertData(uint number) {
       SomeDataList[number] = SomeData({
           users : nullArray
       });

       SomeDataList[number].users.push(msg.sender);
   }


   function getusers(uint number) constant returns(address []){
       return SomeDataList[number].users;
   }

   function getNullArray() constant returns(address[]){
       return nullArray;
   }

   function pushNullArray(address addr){
       nullArray.push(addr);
   }

}

nullArraySomeDataList充當兩個不同的變數。以下是呼叫後的函式呼叫結果,pushNullArray(address addr)insertData(uint number)帶有一些任意值。

在此處輸入圖像描述

他們不一樣。

希望這可以幫助!

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