2016-04-26 7 views
0

Betrachten Sie dieses Beispiel:Ist der Operator C `=` Speicher kopieren, wenn zwischen Strukturen angewendet?

typedef struct { 
    int x; 
    int y; 
    ... 
} ReallyBigItem; 

ReallyBigItem* array = (ReallyBigItem*) malloc(sizeof(ReallyBigItem) * 8); 

ReallyBigItem* item = (ReallyBigItem*) malloc(sizeof(ReallyBigItem)); 
item->x = 0; 
item->y = 1; 

array[0] = *item; 

ReallyBigItem* array = (ReallyBigItem*) malloc(sizeof(ReallyBigItem) * 8);

ich Platz für ein Array bin Zuteilung, die in 8 ReallyBigItem structs passt.

ReallyBigItem* item = (ReallyBigItem*) malloc(sizeof(ReallyBigItem));

Ich Zuteilung Platz für einen ReallyBigItem und Speicherung es Speicheradresse in item.

array[0] = *item;

Jetzt setze ich das erste Element des Arrays zu diesem Artikel.

Meine Frage ist:

der = Operator Ist eigentlich Kopieren über die bereits zugewiesenen Speicher? Also die Item-Struktur existiert im Speicher zweimal?

+1

Ja, so wie 'int a = b 'der Wert von' b 'dann zweimal im Speicher vorhanden ist. –

+1

Wirf nicht das Ergebnis von 'malloc' & friends in C. – Olaf

Antwort

1

Also die Item-Struktur existiert zweimal im Speicher?

Der Inhalt der struct dass item Punkte existiert zweimal nach der Zuweisung in Frage, ja.

Erläuterung:

Beide Operanden dieses Ausdrucks

array[0] = *item; 

bewerten zu einem struct.

Die = ist definiert für struts.

Also der obige Ausdruck kopiert Daten (Speicherinhalt, nicht "Speicher" wie Sie Wort) von rechts struct auf der linken Seite.

Dies könnte offensichtlicher sein, wenn man bedenkt, dass *item eigentlich die gleiche wie item[0] ist, so dass der obige Ausdruck entspricht:

array[0] = item[0]; 
+0

Danke, macht jetzt mehr Sinn. Ich war mehr neugierig auf Arrays von Structs ('Item *') anstelle von Zeigern auf Struct ('Item **'), die tatsächlich Speicher zu verschwenden scheinen, wenn die ganze Struktur über '=' –

+0

@ ᴘᴀɴᴀʏɪᴏᴛɪs gesetzt wird: Bitte beachte das Ihr Code definiert keine Arrays, sondern nur zwei Zeiger 'array' und' item', wobei ein Speicher für acht 'struct' und der andere Speicher für eine' struct' reserviert wird. Beide sind vom selben Typ: 'ReallyBigItem *' das ist ein Zeiger auf 'ReallyBigItem'. – alk

+0

'ReallyBigItem ** ppa;' würde 'ppa' als Zeiger auf einen Zeiger auf' ReallyBigItem' definieren. – alk

1

Ja, Sie kopieren die gesamte struct hier. Sie könnten eine ReallyBigItem **array erstellen und einfach item (nicht *item) zuweisen, um nur den Zeiger zu kopieren.

0

Ja, es tut. Sie kopieren die gesamte Struktur.

Hier Beweis: http://ideone.com/cXZqNP

Code:

#include <stdio.h> 
typedef struct { 
    int x; 
    int y; 
} ReallyBigItem; 

int main(void) { 
    ReallyBigItem* array = (ReallyBigItem*) malloc(sizeof(ReallyBigItem) * 8); 

    ReallyBigItem* item = (ReallyBigItem*) malloc(sizeof(ReallyBigItem)); 
    item->x = 0; 
    item->y = 1; 

    array[0] = *item; 
    printf("%d - %d\n", array[0].y, item->y); 
} 
Verwandte Themen