C Dynamisches Array mit Malloc, dessen Einträge wieder aus dynamischen Array bestehen

hell-student

Lieutenant
Registriert
Nov. 2007
Beiträge
671
Hallo Zusammen,

Ich habe momentan folgendes Problem. Ich habe ein Dynamisches Array von einem Struct erzeugt mit malloc, welches ich zur Laufzeit erweitere. Darin enthalten sind sowohl ints als auch wieder ein Array von typ int, welches ich auch gerne varial hätte.

Habe also irgendein Struct s mit

Code:
struct s {
int a;
int b;
int *c;
}

s *s_array = (struct s *) malloc(2 * sizeof(struct s));

Ich weis, man sollte malloc ja nicht casten, aber irgendwie hats so funktioniert. Wenn also das Array s_array voll ist (Vergleich geht über counter) rufe ich realloc auf (und verdopple).

All dies funktioniert wunderbar, sofern ich das interne array c weglasse. Wenn ich aber dafür auch wieder Speicher allokiere, pfuscht er im Speicher rum und löscht mir meinen ersten Eintag des Struct Arrays. Also wenn beispielsweise wie hier 2 Einräge dann voll sind und ich möchte einen dritten hinzufügen sieht es so aus:

slot 0: Eintrag X
slot 1: Eintrag Y

Einfügen von Z

Array erweitert auf 4

slot 0: Eintrag Z
slot 1: Eintrag Y
slot 2: frei
slot 3: frei

Ich hoffe ich konnte einigermaßen darstellen, was mein Problem ist. Wie kann ich den Eintrag C als dynamisches Array implementieren? thx
 

Anhänge

  • Bildschirmfoto3.png
    Bildschirmfoto3.png
    161,7 KB · Aufrufe: 221
poste mal deinen code, dann kann man mehr sagen.

ansonsten empfehle ich dringend bei speicherproblemen in C valgrind zu benutzen. läuft zwar nur unter linux, aber dafür kann man sich ja z.b. kostenlos ne VM mit linux installieren. ist wirklich extrem mächtig.
 
Valgrind werd ich mal ausprobieren. Linux hab ich bereits laufen. Unter Win könnte ich gar nicht proggen =)
 
Code:
struktur[index].zeiger = malloc(größe);

€: Und wieso "soll" man malloc() nicht casten? Schadet doch nicht, wenn man Bock drauf hat.
Und unter umständen macht es dem Leser klarer, was passiert.
 
hell-student schrieb:
All dies funktioniert wunderbar, sofern ich das interne array c weglasse. Wenn ich aber dafür auch wieder Speicher allokiere, pfuscht er im Speicher rum und löscht mir meinen ersten Eintag des Struct Arrays.
das liegt vermutlich daran, dass du das interne Array so anlegen willst, dass es im Speicher direkt hinter dem Feld b des ersten Elements s_array[0] des Arrays s_array zu liegen kommt. Das kann natürlich nicht funktionieren, da für s_array[0] nur der Speicherplatze sizeof(struct s) zur Verfügung steht, das wäre:

4 Bytes für den int-Wert a
+ 4 Bytes für den int-Wert b
+ 4 Bytes für den Pointer c (sofern es ein 32-Bit-System ist, auf einem 64-Bit-System wären es 8 Bytes)
= 12 Bytes

Der Inhalt des internen Arrays muss also woanders hin. Und zwar in einen Speicherbereich, auf dessen Anfang der Pointer c zeigt. Codemäßig sähe das so aus:
Code:
s *s_array = (struct s *) malloc(2 * sizeof(struct s));
s_array[0].c = (int) malloc(4711 * sizeof(int));
Damit hast du für das interne Array einen Speicherplatz für 4711 Elemente (vom Typ int) bereitgestellt. Wohlgemerkt ist der insgesamt allokierte Speicher dann nicht mehr einfach zusammenhängend. Du hast einen Speicherbereich mit 12 zusammenhängenden Bytes für das Array s_array, und einen zweiten Speicherbereich mit 4711*4 zusammenhängenden Bytes für das Array s_array[0].c, diese beiden Speicherbereiche hängend jedoch miteinander nicht zusammen, sondern liegen an ganz unterschiedlichen Stellen im Speicher.
 
Danke nochmal für die Hilfe. So wies scheint habe ich es nun gelöst. Eigentlich in der Art wie Sculletto es beschrieben hat, nur was es einfach verwirrender, da ich alles noch in Methoden/Funktionen gepackt habe und einiges an Code habe. Zudem noch auf Shared Memory zugreife, der auch zu Laufzeit per Signals ausgelesen wird usw. thx

Das mit Valgrind war ein super Tipp. Hatte es früher schonmal benutzt und wusste aber den Namen nicht mehr. Nun kann ich genau nachschauen, ob alles gefreeed wird.
 
Zurück
Oben