Solidity
如何在函式內部初始化一個數組並將項目推入其中?
如何在函式內部初始化一個數組並將項目推入其中?我不會在函式之外初始化。
這是我的程式碼:
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; }