首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >请求从uint256[10]内存到uint256[]内存的无效隐式转换

请求从uint256[10]内存到uint256[]内存的无效隐式转换
EN

Stack Overflow用户
提问于 2022-08-01 08:52:47
回答 1查看 443关注 0票数 2

因此,显然我们不能在使用内存数据位置的同时使用动态数组。但是,下面的代码给出了错误:

代码语言:javascript
复制
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract A {
    uint256[] public numbers;
    
    constructor(uint256[] memory _numbers) {
        for(uint256 i=0; i<_numbers.length; i++) {
            numbers.push(_numbers[i]);
        }
    }

    function get() public view returns (uint256[] memory) {
        return numbers;
    }
}

contract Manager {
    function makeA() public returns(uint256) {
        uint256[10] memory numbers;
        // push is not supported for memory data location of array
        numbers[0] = 10;

        A a = new A(numbers); //Error: Invalid implicit conversion from uint256[10] memory to uint256[] memory requested

        return a.numbers(0);
    }
}

我使用声明静态数组的语法来解决这个问题:

代码语言:javascript
复制
uint256[] memory numbers = new uint256[](5);

虽然它解决了这个问题,但我在概念背后仍然困惑,为什么后来的作品呢?我的假设是,稳健性在uint256[]和uint25610之间的类型不同。如果我错了,纠正我,对这种行为的解释也会有帮助。

EN

回答 1

Stack Overflow用户

发布于 2022-08-01 18:52:57

不同之处如下:

首先,静态数组将在定义时分配其内存插槽。

然而,动态数组需要在每次将新元素放入其中时发出新的分配。

在普通的OOP语言中,这似乎不是一件大事,但坚实性要求每条指令使用gas,而这正是这种差异不容忽视的地方。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73191155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档