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

问询:将mload(0x40)赋值给address变量时的具体行为

当把mload(0x40)赋值给address变量时的行为分析

首先明确几个核心基础:

  • mload(0x40) 读取的是EVM内存中0x40位置的数值,这是EVM的空闲内存指针,本质是一个32字节的无符号整数,初始值为0x80,会随着内存分配操作不断递增。
  • Solidity中的address类型是160位(20字节)的数值,仅能容纳20字节的数据。

针对你给出的代码:

address tempBytes;
assembly {
  tempBytes := mload(0x40) // 0x40 is the free memory pointer
}

具体执行逻辑如下:

  1. mload(0x40)从内存中取出32字节的空闲内存指针值(比如初始状态下是0x0000000000000000000000000000000000000000000000000000000000000080)。
  2. 赋值给address类型变量时,EVM会自动截断该32字节值的高位12字节,仅保留最低的20字节作为tempBytes的最终值。
    • 以初始指针值为例,截断后得到的address为0x0000000000000000000000000000000000000080。

需要注意:这种操作没有实际业务价值,空闲内存指针是EVM用于内存管理的标记,截断后得到的address通常是未部署合约的无效地址;若指针值超过2^160,截断还会丢失高位信息,导致结果完全偏离原指针的内存管理含义。

内容的提问来源于stack exchange,提问作者mathematica newbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:51:24