2010-11-25 16 views
3

Ich habe einen Strukturzeiger erstellt, aber jeder Aufruf für den neuen Knoten gibt die gleiche Adresse zurück. Aber ich erwartete, dass für jeden Aufruf des neuen Knotens unterschiedliche Adressen zurückgegeben werden. Kann mir bitte jemand helfen?gleiche Adresse in C# struct Zeiger zurückgegeben

public unsafe struct Node 
{ 
    public int Data; 
} 
class TestPointer 
{ 
    public unsafe Node* getNode(int i) 
    { 
     Node n = new Node(); 
     n.Data = i; 
     Node* ptr = &n; 
     return ptr; 
    } 
    public unsafe static void Main(String[] args) 
    { 
     TestPointer test = new TestPointer(); 
     Node* ptr1 = test.getNode(1); 
     Node* ptr2 = test.getNode(2); 
     if (ptr1->Data == ptr2->Data) 
     { 
      throw new Exception("Why?"); 
     } 
    } 
} 
+0

Dieser Code ist fast das klassische Beispiel für dangling Zeiger. –

+0

Aber der "Neue" ließ mich auch noch eine Weile täuschen, bevor ich mir den IL-Code ansah. – TToni

Antwort

4

Lassen Sie sich nicht von der Syntax Node n = new Node(); täuschen! Node ist eine Struktur, n ist auf dem Stapel zugeordnet. Sie rufen getNode zweimal von der gleichen Funktion in der gleichen Umgebung auf, so dass Sie natürlich zwei Zeiger auf den gleichen Stapelspeicherort erhalten. Darüber hinaus werden diese Zeiger ungültig ("baumeln"), sobald getNode zurückkehrt, da der Stapelspeicherort, der zu n gehörte, möglicherweise von einem anderen Aufruf überschrieben wird. Kurz gesagt: Tu es nicht. Wenn CLR Speicher reservieren soll, machen Sie Node eine Klasse.

+0

Eigentlich meine schlechte. Ich habe den Post des OP falsch gelesen. Ich dachte, er würde den Knoten selbst zurückgeben, nicht nur den Zeiger. Ich nahm meine Down-Abstimmung, aber jemand anderes stimmte in der Zwischenzeit ... –

+0

@Mike Oh. Dann bitte ich um Entschuldigung. BTW, wenn er den Knoten selbst zurückgab, würde es normalerweise nicht auf dem Haufen gehen, sondern in Stapelspeicherplatz, der vom Anrufer zugeteilt wurde. –

+0

Gute Antwort! Wenn Sie sich den generierten Code mit ildasm ansehen, sehen Sie, dass ein Heap-Objekt niemals zugewiesen wird und n nur lokal ist: ".locals init ([0] valuetyp ConsoleApplication2.Program/Node n, ...") – TToni

0

Wird n Müll gesammelt?

+0

Nein. Es ist nicht auf dem Heap sondern auf dem lokalen Stack. – TToni