Solidity中如何通过结构体接收用户输入?代码报错求助
Solidity合约编译错误修复:Data location must be "memory" or "calldata"
错误原因
- 引用类型未指定数据位置:Solidity 0.7.0及以上版本强制要求,
string这类引用类型作为函数参数时,必须显式声明数据位置(memory或calldata)。你的setDetails函数中string a和string c未声明,触发编译错误。 - 类型不匹配:构造
Details结构体实例时,错误使用单引号包裹'a'和'c'(这是字符字面量),但结构体定义的是string类型,应直接使用变量名a和c。
修正后的合约代码
pragma solidity >=0.7.0 <0.9.0; contract emp { struct Details { string name; uint id; string post; } Details dtl; // 为string参数添加calldata(只读场景最优选择) function setDetails(string calldata a, uint b, string calldata c) public { dtl = Details(a, b, c); } function output() public view returns (string memory, uint, string memory) { return (dtl.name, dtl.id, dtl.post); } }
关键说明
- calldata vs memory:如果函数内不需要修改参数值,优先用
calldata,它直接读取调用数据,不占用内存,gas成本更低;若需要在函数内修改参数,改用memory。 - 值类型(如
uint、bool)无需指定数据位置,默认存储在栈中。
内容的提问来源于stack exchange,提问作者kartavya arya
相关产品推荐
相关产品推荐

