1. 程式人生 > >solidity智慧合約[42]-memory與storage相互轉換

solidity智慧合約[42]-memory與storage相互轉換

memory 賦值 狀態變數

下面的例子說明了memory賦值給storage的情況。在test函式中,memory空間的變數s複製給了狀態變數stu。為值的拷貝問題。並且由於這兩個空間互不影響。因此修改變數的值不會影響到另一個變數的值。
當呼叫call函式時,返回100,"jonson"。s的修改不會影響變數stu。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pragma solidity ^0.4.23;
contract MemoryTostorage{

     struct student{
       uint grade;

       string name;
   }

   student stu;

   function test(student  memory s) internal{

       stu = s;
       s.name = "alice";
   }


   function call() returns(uint,string){

       student memory guy = student(100
,"jackson");

       test(guy);
       return (stu.grade,stu.name);
   }
}

storage 賦值 memory

如下例,說明了storage複製給結構體 memory變數的情況。在test函式中,其實質是將s引用的狀態變數的值賦值給了guy。
變數guy不是儲存的引用,而是一個結構體空間。當呼叫call函式時,返回100,"jonson"。對於guy的修改不會影響到stu的修改。

1
2

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
contract storageToMemory{

     struct student{
       uint grade;
       string name;
   }

   student stu = student(100,"jackson");

function test(student  storage s) internal{

   student memory guy = s;
   guy.grade = 50;
}

function call() public returns(uint,string){

   test(stu);

   return (stu.grade,stu.name);
}

memory 轉 memory

memory與memory之間的相互轉換是值傳遞。
在下面的例子中,當呼叫call函式時,在memory中開闢了結構體的三個例項空間a、b、c。賦值為值的拷貝。他們之間互不影響。
修改一個變數不會影響其他變數的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
pragma solidity ^0.4.23;


contract memoryTomemory{
   struct student{
       uint grade;
       string name;
   }

   function test(student memory b) internal{
       student memory c = b;
       c.name = "jonson";
   }

   function call() returns(string){
       student memory a =  student(100,"olaya");
       test(a);
       return a.name;
   }
}

image.png