You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solidity中如何通过结构体接收用户输入?代码报错求助

Solidity合约编译错误修复:Data location must be "memory" or "calldata"

错误原因

  1. 引用类型未指定数据位置:Solidity 0.7.0及以上版本强制要求,string这类引用类型作为函数参数时,必须显式声明数据位置(memory或calldata)。你的setDetails函数中string a和string c未声明,触发编译错误。
  2. 类型不匹配:构造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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:25:27