Ich mache das gleiche in beiden Codes.
In Code 1: Ich habe eine char *
verwendet und den Platz mit malloc
in main
zugewiesen.
In Code 2: Ich habe ein Array char
für den gleichen Zweck verwendet. Aber warum ist die Ausgabe anders?
Code 1:
%Vor%Code 2:
%Vor% Im zweiten Beispiel weisen Sie a
auf b
zu, was bedeutet, dass a.p
( char*
) b.p
zugewiesen wird. Daher ändert das Ändern des Speichers, auf den b.p
zeigt, auch den Speicher, auf den a.p
zeigt, da beide auf den gleichen Speicherort im Speicher zeigen .
Im ersten Beispiel haben Sie zwei separate Arrays . Die Zuweisung von a
zu b
kopiert jedes char
im Array a.p
in b.p
- diese Speicherblöcke sind Teil von struct
, sie sind keine Zeiger auf a spezifischer Teil im Speicher. Jede Änderung an b.p
in diesem Fall kann a.p
nicht beeinflussen, da sie völlig unabhängig sind.
In Ihrem ersten Code enthält die Struktur ein Array tatsächlicher Zeichen ( char[10]
). Wenn Sie also die Struktur kopieren ( b = a
), wird das Array ebenfalls kopiert. Dann überschreibst du einen von ihnen, aber nicht den anderen.
In Ihrem zweiten Code enthält die Struktur einen Zeiger auf ein Zeichen. Wenn Sie also die Struktur kopieren, wird der Zeiger kopiert, die Daten jedoch nicht. Also zeigen beide auf die gleichen Daten.
Zeichenzeiger und Zeichenfelder sind nicht dasselbe.
Ihr Knoten mit dem Array wird kopiert, sodass der Inhalt in den neuen Knoten kopiert wird. Wenn Sie den neuen Wert (Überlauf) in den kopierten Knoten (b) einfügen, überschreibt er nur die Kopie.
Ihr Knoten mit dem Zeichenzeiger wird den Wert des Zeigers kopiert, so dass beide Knoten auf den gleichen Speicherort verweisen. Wenn Sie den neuen Wert (Überlauf) in den kopierten Knoten (b) schreiben, schreibt er in den Speicher, dass beide Knoten einen Zeiger auf haben.