Solidity -数组

745 阅读1分钟

solidity中,有两种数组:存储数组和内存数组

存储数组(Storage arrays)

这些数组被声明为状态变量,并且可以具有固定长度和动态长度。动态储存数组可以调整数组的大小,它们通过访问push()和pop()方法来调节长度。

// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity ^0.8.17;

contract A {
    uint256[] public numbers; // 动态长度数组
    address[10] private users; // 固定长度数组

    uint8 users_count;

    /**
     * 添加用户
     */
    function addUser(address _user) external {
        require(users_count < 10, "number of users is limited to 10");
        users[users_count] = _user;
        users_count++;
    }

    function addNumber(uint256 _number) external {
        numbers.push(_number);
    }
}

内存数组(memory arrays)

数组以memory作为其数据位置声明。可以具有固定长度或动态长度,但是不能调整大小(不能调用push和pop方法),数组的大小必须预先计算

// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity ^0.8.14;

contract B{

    function createMemArrays() external view {
        uint256[20] memory numbers;
        numbers[0] = 1;//你不会收到任何警告,但最终将得到无效的操作码,因为根据内存中布局的描述,array将指向零插槽,因此切勿写入。请记住,在使用数组之前,请务必先对其进行初始化,以便获取有效的地址
        numbers[1] = 2;

        uint256 users_num = numbers.length;

        // address[users_num] memory users1;
        address[] memory users2 = new address[](users_num);
        users2[0] = msg.sender;
        // users2.push(msg.sender);//Member "push" is not available in address[] memory outside of storage

    }
}