2012-04-05 19 views
0

Ich verstehe nicht, wie Sie dynamisch Speicher für ein Array von Strukturen innerhalb einer anderen Struktur zuweisen. Wie in, hier ist mein Problem ... Ich habe eine Projekt.c-Datei, die die wichtigsten enthält, habe ich eine andere polynomial.c-Datei, die alle Poly-Operationen behandelt wie das Hinzufügen von Begriffen, ein Polynom mit einer Zahl ect multiplizieren.Dynamic-Speicher-Zuweisung eines Arrays innerhalb einer Struktur,

Dies ist Header-Datei für polynomials.h

typedef struct term{ 
    int coeff; 
    int expo; 
} TERM; 

typedef struct polynomial { 

int size; 
// This needs to be changed to calloc.. not sure how within a struct 
TERM terms[20]; 

} POLYNOMIAL; 
... 
... 

ich dies auch in meiner project.c-Datei, die dynamisch Speicher für die Poly-Array zuweist.

POLYNOMIAL *polynomials = (POLYNOMIAL *)malloc(sizeof(POLYNOMIAL) * 8); 
// 8 being the max number of polynomials I wan to store 

Ich habe zwei Fragen hier, wann und wie sollte ich dynamisch den Speicher für die Begriffe Array zuweisen? Ich dachte mir, vielleicht einen Zeiger auf einen Zeiger zu machen, der den Calloc-Speicher für ein leeres Array von Termen hält. Dies würde am Programmstart erfolgen, aber nach der Polynom-Zuweisung (denke ich).

Eine andere Frage, jetzt, wenn ich gehe, um den Speicher zu befreien, sollte dies am Ende des Programms getan werden, bevor es beendet und die Reihenfolge, in der ich frei sein sollte unten sein, richtig? Mit anderen Worten, befreie das Terme Array und dann das Polynom Array.

An dieser Stelle wären Hinweise oder Hinweise hilfreich. Vielen Dank!

Antwort

1

Sie können es einfach zuteilen mit

TERM *terms = calloc(20, sizeof(TERM)); 

Sie können es nicht innerhalb der Strukturdeklaration direkt tun so, was Sie sich so etwas wie

POLYNOMIAL *polynomials = calloc(size, sizeof(POLYNOMIAL)); 

for (int i = 0; i < size; ++i) 
    polynomials[i].terms = calloc(20, sizeof(TERM)); 

Und ja zu tun ist, werden Sie müssen Speicher nach unten geben, zuerst befreien Sie alle Begriffe, dann befreien Sie das Array von POLYNOMIALS.

+3

Das qualifiziert, seine Hausaufgaben für ihn zu machen. Wäre es nicht besser, es nicht zu lösen, sondern ihn zu einer Lösung zu führen, ohne es für ihn zu tun? –

+0

Wann und wo sollen die * Terms Calloc aufgerufen werden? – Hall9

+0

Die Hauptsache ist, dass die Polynome, die Sie verwenden, auf gültige Zeiger zeigen, andernfalls können Sie ihre Mitglieder nicht zuweisen. – Jack

0

Da Ihre Frage Hausaufgaben getaggt ist, werde ich Ihnen nicht genau sagen.

TERM terms[20] ist ein literales In-Place-Array. Wenn Sie eine Variable wie diese in einer Funktion deklariert haben, würde sie für diese Anzahl von Array-Elementen genau Platz auf dem Stapel reservieren. Wenn Sie es innerhalb einer Struktur tun würden, würde es innerhalb der Struktur selbst Raum hinterlassen. Sie wurden also aufgefordert, etwas von X x[n] in die entsprechende Pointer-Syntax zu ändern, die auch für die Array-Syntax verwendet wird.

Sie haben bereits POLYNOMIAL * polynomials geschrieben, sodass Sie wissen, dass dies sowohl (a) ein Zeiger auf ein einzelnes Polynom als auch (b) ein Zeiger auf ein Polynomfeld ist und dass Sie es mit einem malloc Ausdruck initialisieren können.

Wenn Sie das verwenden, was Sie bereits aus der Frage kennen, können Sie sicher sehen, was Sie gefragt werden, um sich selbst ein Bild zu machen; Damit können Sie das Feld term so umschreiben, dass es auf eine oder mehrere Strukturen zeigen kann.

0

für einen Start Ihre polynomial Struktur sollte wie folgt aussehen:

typedef struct polynomial { 
    int size; 
    TERM *terms; 
} POLYNOMIAL; 

dann für jede polynomial struct Sie haben:

p.terms = calloc(size, sizeof(*terms)); 

Sie müssen die Speicher, auf den terms, bevor Sie frei befreien die polynomial Strukturen, da Sie sonst nicht auf das terms Mitglied zugreifen können.

Verwandte Themen