因此,显然我们不能在使用内存数据位置的同时使用动态数组。但是,下面的代码给出了错误:
// 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);
}
}我使用声明静态数组的语法来解决这个问题:
uint256[] memory numbers = new uint256[](5);虽然它解决了这个问题,但我在概念背后仍然困惑,为什么后来的作品呢?我的假设是,稳健性在uint256[]和uint25610之间的类型不同。如果我错了,纠正我,对这种行为的解释也会有帮助。
发布于 2022-08-01 18:52:57
不同之处如下:
首先,静态数组将在定义时分配其内存插槽。
然而,动态数组需要在每次将新元素放入其中时发出新的分配。
在普通的OOP语言中,这似乎不是一件大事,但坚实性要求每条指令使用gas,而这正是这种差异不容忽视的地方。
https://stackoverflow.com/questions/73191155
复制相似问题