Unterschied zwischen Zeichenfeld und Zeiger

8

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%     
Anil Kumar Arya 06.01.2012, 21:48
quelle

3 Antworten

10

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.

    
AusCBloke 06.01.2012, 21:52
quelle
3

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.

    
Dan 06.01.2012 22:01
quelle
3

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.

    
That Chuck Guy 06.01.2012 21:53
quelle

Tags und Links