2016-12-07 2 views
1

Ich habe Mühe, herauszufinden, wie Speicher für meine studentContent Variable zuweisen.wie Speicher einer Strukturvariablen zu reservieren

struct contactInfo { 
    char Name[101]; 
    char Assignment[101]; 
    char MarkDescription[101]; 
    char feedBack[12][101]; 

}; 
struct contactInfo studentContent 

Ich möchte malloc() verwenden, um Speicher für meine Strukturvariable zuzuweisen. Nachdem die Struktur gefüllt ist, möchte ich den Speicher neu zuweisen, so dass ich nur so viel Platz in jedem Feld brauche, wie ich brauche.

+0

Warum reservieren Sie Platz für 2 Strukturen? Und was meinst du, wenn du sagst, dass die Größe der Inhalte anders sein wird? Wie das? –

+0

Entschuldigung, vielleicht habe ich einen Fehler gemacht. Ich möchte Speicherplatz für 1 Struktur zuweisen. Der Inhalt wird bei jedem Looping anders sein. Ich durchlaufe eine Datei, die jede Zeile zieht und jede Zeile in ihrem respektierten Feld innerhalb der Struktur speichert. Nachdem ich alle Felder ausgefüllt habe, schreibe ich diese Inhalte in einer anderen Reihenfolge in eine Datei. Meine Schleife liest dann weiter die Datei und speichert den nächsten Satz von Daten in der Struktur, so dass die Felder beim zweiten Mal in der Größe variieren können. – bodotheguy

+0

Sie können die Größe der Elemente in der Struktur nicht ändern. Sie werden immer die Größe haben, für die sie erklärt wurden. Wenn die Strings, die Sie in diese Arrays lesen, kleiner sind als die Größe des Arrays, ist das in Ordnung. Du musst nichts dagegen tun. –

Antwort

1

Die erste Zuweisung setzt ptr auf die Adresse der lokalen Variablen studentContent, die nächste Zeile überschreibt diese jedoch. Es ändert ptr, um auf einen dynamisch zugewiesenen Puffer mit Platz für 2 Instanzen von struct contactInfo zu verweisen.

Wenn das, was Sie wollen, ist ein Array von struct contactInfo zu haben, und haben die Anzahl der Elemente des Arrays erhöhen, wie Sie mehrere Instanzen von struct contactInfo zu füllen haben, Sie ptr zu realloc mit einer Größe von n * sizeof *ptr vorbei, wo n ist die Anzahl der Elemente im Array.

struct contactInfo *tmp_ptr = realloc(ptr, n * sizeof *ptr); 
if (tmp_ptr == NULL) { 
    perror("realloc failed"); 
    exit(1); 
} 
ptr = tmp_ptr; 

Beachten Sie, dass Sie müssen keine Instanz von struct contactInfo (studentContent in Ihrem ursprünglichen Code) erklären, nur ein Zeiger auf ein.

EDIT:

Basierend auf Ihrem Kommentar, da Sie nur eine einzige Instanz benötigen, um zu füllen, ein Bohrfutter von Daten zu einem Zeitpunkt, zu lesen und zu schreiben, brauchen Sie keine dynamische Speicherzuweisung zu verwenden. Erklären Sie einfach eine einzelne Instanz und überschreiben Sie den Inhalt jedes Mal.

+0

Ich weiß, ich brauche es nicht notwendig, aber wenn eines meiner Felder ein Char-Array [101] ist, das nur zur Hälfte gefüllt ist. Ich möchte dieses Feld auf genau die benötigte Größe reduzieren. Ich möchte nur so viel Platz einnehmen, wie ich brauche. Um zu üben, willen. – bodotheguy

+0

Ich bin noch nicht da und es ist wahrscheinlich eine separate Frage, aber ich möchte alle meine Felder Zeiger machen, so dass ich nur auf ein Zeichen zeigen kann [101], wenn das möglich ist. – bodotheguy

+0

Wenn ich es mit Daten bis zu [50] id füllen möchte, muss ich nur bis zu [50] verwenden. Ist das sinnvoll? – bodotheguy

Verwandte Themen