Warum verweisen in Funktionen deklarierte Arrays standardmäßig auf den Speicherpunkt 0?

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.

Antworten (1)

Was mich jedoch verwirrt, ist, dass if uint [] xzeigt auf 0, wo someVariablesich befindet, nicht uint[] datadasselbe tun würde?

Nein, datawü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 dataSteckplatz 1 belegt wird, würde nicht xnur 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.

Ich kenne Datenpunkte zu Position 1, ich bin mir nur nicht sicher, warum sie nicht auf 0 zeigen. Und ich wollte "2" sagen, nicht "3". Wie auch immer, die Solidity-Dokumentation hat mich etwas verwirrt. Was ist in diesem Zusammenhang mit "dynamisch zugeteilt" gemeint? Ich dachte, es bedeutet eine Sache, aber es scheint etwas anderes zu bedeuten. Diese Antwort deutet darauf hin, dass "data" und "someVariable" dynamisch zugewiesen werden, aber wie kann das sein, wenn sie sich im Speicher befinden und "Speicher nicht dynamisch zugewiesen wird"? Was ist auch mit "nicht initialisiert" gemeint - ich verstehe nicht, wie "data" initialisiert wird, "x" jedoch nicht.
datahat einen initialisierten Speicherzeiger (da eine Zustandsvariable ist), während xno (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