Was ist der richtige Weg, um eine Struct-Instanz innerhalb einer Funktion zu erstellen?

Ich habe irgendwo gelesen, dass, wenn Sie eine Speichervariable innerhalb einer Funktion erstellen, diese eine andere vorhandene Variable im globalen Geltungsbereich des Smart Contracts überschreiben könnte, stimmt das?

Wenn ich also eine neue Strukturvariable in einer Funktion erstellen und sie dann in ein Array verschieben wollte, sollte ich sie im Speicherplatz oder im Speicherbereich erstellen?

So was:

MyStruct storage newStruct;
... // modifiying newStruct variables
myStructsArray.push(newStruct);

Oder so:

MyStruct memory newStruct;
... // modifiying newStruct variables
myStructsArray.push(newStruct);

Dieselbe Frage, wenn Sie einer Zuordnung eine neu instanziierte Struktur hinzufügen möchten:

MyStruct storage/memory newStruct;
...
MyStructMapping[index] = newStruct;

Antworten (1)

Wenn Sie versuchen, eine Speicherstruktur einer lokalen Speichervariablen zuzuweisen, gibt der Compiler eine Fehlermeldung aus:

// This doesn't work, because it would need to create a new temporary 
// unnamed struct in storage, but storage is "statically" allocated.
// MyStruct storage newStruct = MyStruct();

Stattdessen müssen Sie eine memoryVariable verwenden:

// This works.
MyStruct memory newStruct = MyStruct();

Wenn Sie eine Zustandsvariable haben (oder ein Array/Mapping, das diese Struktur enthält), können Sie sie einer lokalen Speichervariablen zuweisen:

// Reference type local variables are storage by default, 
// you can omit the storage keyword.
MyStruct newStruct = stateStruct;
// Any assignments to fields in newStruct will be written to storage.

Ich habe irgendwo gelesen, dass, wenn Sie eine Speichervariable innerhalb einer Funktion erstellen, diese eine andere vorhandene Variable im globalen Geltungsbereich des Smart Contracts überschreiben könnte, stimmt das?

Ich denke, der Compiler verhindert solche Fälle, da er das Erstellen temporärer unbenannter Speichervariablen nicht zulässt.