Solidity

如何在函式內部初始化一個數組並將項目推入其中?

  • January 19, 2022

如何在函式內部初始化一個數組並將項目推入其中?我不會在函式之外初始化。

這是我的程式碼:

function tokenOfOwner(address owner) public virtual returns (uint256[] memory) 
{
   uint256[] storage _ownerAmount;
   uint256 amount = ERC721.balanceOf(owner);
   for(uint256 i = 0; i< amount ; i++)
   {
       _ownerAmount.push(_ownedTokens[owner][i]);
   }
   return _ownerAmount;
}

錯誤資訊顯示:

TypeError: This variable is of storage pointer type and can be accessed without prior assignment, which would lead to undefined behaviour.

TypeError:該變數是儲存指針類型,無需事先賦值即可訪問,這將導致未定義的行為。

完全正常,因為uint256[] storage _ownerAmount;未初始化,這意味著它預設為插槽 0,可能會覆蓋已經佔用該插槽的任何內容。

但是,查看您的程式碼,您可能不需要動態儲存陣列。只有動態儲存數組可以調整大小(推入/彈出),當元素數量未知時這是有意義的,但這不是你的情況,因為:

uint256 amount = ERC721.balanceOf(owner);

更高效的實現只能依賴具有固定大小的靜態記憶體數組,例如:

function tokenOfOwner(address owner) public virtual returns (uint256[] memory) 
{
   uint256 amount = ERC721.balanceOf(owner);
   uint256[] memory _ownerAmount = new uint[](amount);
   for(uint256 i = 0; i< amount ; i++)
   {
       _ownerAmount[i] = _ownedTokens[owner][i];
   }
   return _ownerAmount;
}

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