Gemäß der Solidity-Dokumentation für den folgenden Code:
"... der Compiler interpretiert x als einen Speicherzeiger und lässt ihn standardmäßig auf den Speicherplatz 0 zeigen. Dies hat den Effekt, dass eine Variable (die sich im Speicherplatz 0 befindet) von x.push(2) modifiziert wird."
/// THIS CONTRACT CONTAINS AN ERROR
pragma solidity ^0.4.0;
contract C {
uint someVariable;
uint[] data;
function f() public {
uint[] x;
x.push(2);
data = x;
}
}
In einem anderen Beitrag wies Benutzer smarx darauf hin:
„Wenn Sie eine Speichervariable deklarieren, handelt es sich im Wesentlichen um einen Verweis auf einen Speicherort. Bis Sie sie etwas zuweisen, zeigt sie auf Speicherort 0, der zufällig auch der Speicherort der ersten deklarierten Zustandsvariablen ist (in diesem Fall a). . Sie verwenden im Grunde einen nicht initialisierten Zeiger".
Was mich jedoch verwirrt, ist, dass, wenn "uint [] x" auf 0 zeigt, wo sich "someVariable" befindet, "uint[] data" nicht dasselbe tun würde? Sind diese beiden Arrays nicht nicht initialisiert? Wenn „data“ Steckplatz 1 belegt, würde „x“ dann nicht einfach Steckplatz 2 belegen?
Meine Vermutung ist, dass, wenn es sich innerhalb einer Funktion befindet, es wieder bei 0 beginnt, vorausgesetzt, dass alles im Speicher gespeichert wird, aber dann würde ich erwarten, dass ein Array, das innerhalb einer Funktion deklariert wird, standardmäßig auf den Speicher verweist.
Was mich jedoch verwirrt, ist, dass if
uint [] x
zeigt auf 0, wosomeVariable
sich befindet, nichtuint[] data
dasselbe tun würde?
Nein, data
würde auf den Ort 1 zeigen.
Sind diese beiden Arrays nicht nicht initialisiert?
ja, aber der zweite zeigt auf einen nicht initialisierten Speicherort, der standardmäßig 0 ist (da der Speicher nicht dynamisch zugewiesen wird). Laut Dokument:
Der Typ der lokalen Variablen x ist uint[] storage, aber da der Speicher nicht dynamisch zugewiesen wird, muss er von einer Zustandsvariablen zugewiesen werden, bevor er verwendet werden kann. Daher wird x kein Speicherplatz zugewiesen, sondern es fungiert nur als Alias für eine bereits vorhandene Variable im Speicher.
.
Wenn
data
Steckplatz 1 belegt wird, würde nichtx
nur Steckplatz 3 belegt?
Nein, da nicht dynamisch vergeben. Aber wenn dynamisch zugewiesen würde, wird seine Referenz in Slot 2 und nicht in Slot 3 gespeichert.
AMadman erstellt
mirg
data
hat einen initialisierten Speicherzeiger (da eine Zustandsvariable ist), währendx
no (zeigt also auf 0). Nur Zustandsvariablen dürfen im Speicher gespeichert werden, lokale Variablen können auf Speicherorte zeigen (im Fall von Arrays oder Structs), können aber nicht als neuer Speicherzeiger innerhalb der Funktion definiert werden, da eine dynamische Zuordnung nicht zulässig ist