> For the complete documentation index, see [llms.txt](https://my-organization-23.gitbook.io/solidity-basic/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://my-organization-23.gitbook.io/solidity-basic/evmno.md).

# EVMの記憶領域

| 名前       | 保存場所                    | ガス代   | 更新できるか |
| -------- | ----------------------- | ----- | ------ |
| storage  | 永続的ストレージ (ステート変数が格納される) | かかる   | できる    |
| memory   | 一時領域                    | かからない | できる    |
| calldata | 一時領域                    | かからない | できない   |

storage

```solidity
contract StorageContract {
    // storageタイプのステート変数
    int[] numbers;
 
    function storageTest() external {
        // numbers 配列にデータを追加
        numbers.push(1);
        numbers.push(2);
        
        // storage キーワードを使用して新しいインスタンスを作成
        int[] storage myArray = numbers;
        
        // 新しいインスタンスの最初の要素に値を追加
        myArray[0] = 0;
    } 
}
```

memory

メモリは、一時的に必要な変数に使用されます。例えば、関数の引数、ローカル変数、または関数の実行中に動的に作成される配列などです。関数の実行が完了すると、メモリ領域は解放されます。

```solidity
contract MemoryContract {
    
    // データ構造体
    struct Data {
        uint a;
        uint b;
    }
  
    function memoryTest() external pure returns(uint){
        // メモリ上に Data 型のインスタンスを作成
        Data memory dt;
        dt.a = 1;
        dt.b = 2;
        
        // データの合計を返す
        return dt.a + dt.b;
    }
}
```

```solidity
contract MemoryContract {
    function memoryTest(uint256[] memory array) external pure returns (uint256[] memory) {
        // memoryなので変更可能
        array[0] = 1;
        return array;
    }
}
```

calldata

外部から呼び出された関数の引数に使用され、変更できないものです。

```solidity
contract CalldataContract {
    function calldataTest(uint256[] calldata array) external pure returns (uint256) {
        uint256 total = 0;

        // arrayはcalldataなので変更不可
        for (uint256 i = 0; i < array.length; i++) {
            total += array[i];
        }

        return total;
    }
}
```
