2016-03-20 10 views
-1

Ich suchte nach einer Antwort, schaffte es aber nicht, eine zu finden.Neuzuweisung der dynamisch zugewiesenen Struktur

Ich habe eine dynamisch zugewiesene Struktur, was bedeutet, dass die Struktur selbst zugeordnet wird und einige ihrer Mitglieder. Wie:

typedef struct dataUse 
{ 
    char *num; 
    char *name; 
    char *position; 
    char *eMail; 
    float upload; 
    float download; 
} DataUse; 

DataUse *ptr = NULL; 

Jetzt habe ich Funktionen Speicher für *ptr neu zu verteilen und auch für *name, *position, *eMail. Die Größe von name, position und variiert natürlich.

Jetzt verstehe ich, dass die Neuzuweisung etwas behält entweder die ursprüngliche Adresse der Daten und erhöhen Sie die Speichergröße oder wenn es nicht auf den gleichen Speicherplatz zuweisen kann, wird es seinen Inhalt kopieren und den Zeiger eine neue Adresse zuweisen.

Jetzt in meinem Fall, wenn ich meine struct (*ptr) umverteilen und wollen ihre Größe erhöhen und letzteres der Fall ist, wird mein structs Inhalt Bedeutung kopiert werden und neue Adresse unterzeichnet werden, was zu *name passieren wird, *position und ? Kann ich noch auf sie und die alten Inhalte über ptr->num zugreifen. Werde ich eine Art Gedächtnisverlust haben?

Ich möchte nur jemanden zu überprüfen, was passieren wird und zu erklären, wie es im Speicher aussehen würde, wenn ich die gesamte Struktur neu zuordnen. Ich habe gesehen, wie Strukturen im Speicher aussehen Ich habe eine Menge Posts gelesen, aber manchmal wird es ein bisschen verwirrend, nachdem ich einige weitere Pointer hinzugefügt habe und tiefer gegangen bin (z. B. Doppelzeiger).

Und was würde passieren, wenn ich es mit Doppelzeiger tun würde - **ptr2 Zeiger zu halten, die auf Structs zeigen und dann realloc **ptr2 noch mehr Zeiger zu halten?

+1

Was? 'Wenn ich meine Struktur neu zuweisen' - Ihre Struktur ist feste Größe! –

+0

Immer wenn du dich fragst, "wie es in Erinnerung" aussehen würde, betrachte es als einen festen Schritt in die Rippen, um einen Debugger auf der Plattform zu starten, auf der du das ausführst und * tust * das: * Blick auf die Erinnerung *. Wie es "aussieht", wird dort besser demonstriert als anderswo. – WhozCraig

+0

@Martin James- Meine Struktur ist nicht festgelegt. Ich habe eine Funktion, die meinem struct ex Speicher hinzufügt: 'void allocStruct (DataUse ** ptr) {Speicher hier zuweisen}'. – Name

Antwort

1

Wenn ich Ihre Frage richtig verstanden habe, haben Sie eine Instanz von DataUse zugewiesen und speichern Sie die Adresse in ptr. Jetzt weisen Sie es neu zu.

Pointers speichert die absolute Adresse, so dass die Neuzuweisung der Struktur mit Zeigern die Daten nicht verliert.

So die Instanz von DataUse liegt irgendwo im Speicher, seine Adresse in ptr gespeichert. Die Daten von num liegen an einer anderen Stelle, ihre Adresse ist im Feld num in DataUse gespeichert. Beim Kopieren der Instanz DataUse an eine andere Stelle wird auch das Feld num kopiert, so dass die Adresse der Zeichenkette num und name usw. unverändert bleibt und sich immer noch in der neuen Kopie der Felder num, name befindet.

Sie ordnen die Struktur einfach neu zu, d. H. Die Positionen, an denen Sie Adressen speichern, werden geändert, aber die in num, name, ... gespeicherten Adressen bleiben unverändert.

+0

"aber die adressen von ..." um, "die adressen * gehalten * in ..." sind wesentlich genauer. Die Adressen * dieser * Mitglieder ändern sich, sobald Sie die Adresse der sie enthaltenden Struktur ändern. – WhozCraig

+0

@songziming Ja. Ich möchte * ptr zuweisen, um weitere Strukturen zu speichern. Also, wenn ich richtig verstehe, wenn meine Struktur kopiert und Speicher hinzugefügt wird, kann ich auf zuvor gespeicherte Strukturen und ihre Mitglieder throug * ptr zugreifen? – Name

0

Wenn wir annehmen ptr[i] gültig ist (zB eine Anordnung von mindestens i+1DataUse zuvor zugeordnet wurde unter Verwendung von malloc()) und die Größe des Speichers, der ptr Punkte erhöht wird realloc() verwenden, dann wird die Adresse von ptr[i].num ändert sich, wenn ptr hat sich geändert, aber der Wert ptr[i].num wird nicht.

0

Betrachten Sie die folgenden Schnipsel:

DataUse *ptr= malloc(sizeof(DataUse)); // allocate non-zeroed memory 

Die oben zuordnet Speicher für Ihre Struktur. Beachten Sie, dass es nicht auf Null gesetzt ist, also muss alles, das auf Null gesetzt werden soll, von Ihnen auf Null gesetzt werden.

ptr->name= malloc(strlen(this_name)+1); 
strcpy(ptr->name, this_name); 

Das obige initialisiert name.

free(ptr_name); 
ptr->name= malloc(strlen(new_name)+1); 
strcpy(ptr->name, new_name); 

Das oben genannte fügt einen neuen Namen in name ein. Es gibt zuerst den zugewiesenen Speicher frei.

char *tmpname= realloc(ptr->name, strlen(new_name)+1); 
if (tmpname) { 
    ptr->name= tmpname; 
    strcpy(ptr->name, new_name); 
} 
else printf("Out of memory); 

Die oben tut (etwa) die gleiche, verwendet aber realloc. Beachten Sie, dass ptr->name Null sein muss, wenn es zuvor nicht verwendet wurde.

Verwandte Themen