C Array dynamisch vergrößern | malloc Struct

hell-student

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

ich möchte gerne ein Array erzeugen, dessen Elemente Structs sind (dieses habe ich selbst definiert). Hierbei soll zur Laufzeit, falls nicht genug Elemente vorhanden sind erweitert werden - zur einfachheit einfach verdoppeln. Ich habe etwas rumgesucht, jedoch nicht wirklich was hilfreiches gefunden. Hier mal mein Code:

In der Header-File:
Code:
typedef struct ms {
	int a;
	int b;
	int c;
} ms;

In der Source-File:

Code:
ms *s = (struct ms *) malloc(4*sizeof(struct ms));

Wenn ich nun auf die 4 Elemente des Arrays zugreifen möchte, müsste ich doch folgendes aufrufen:
Code:
z.b ms[0].a = 3;

Wenn ich nun auf das 5te Element zugreife, müsste es ein Fehler geben.

vergrößern dann mit: realloc()
Code:
realloc(ms, 8*sizeof(struct ms));

Mache ich das nun richtig so? Habt ihr noch einen Link zu dynamischen Array mit Structs oder kann mir jemand ein kleines Beispiel geben. Ich habe alles so implementiert und in eine Funktion gepackt, die genau ms zurückgibt, als Pointer.

Code:
ms * erstelle_ms() {
ms *s = (struct ms *) malloc(4*sizeof(struct ms));
return s;
}

Wenn ich nun eine weitere Source-File nehme und die obige Header-File einbinde und dort die Funktionaufrufe kann ich auch auf das 100 Element zugreifen ohne Fehler.
Code:
ms *p = erstelle_ms();
ms[100].a = 20;

Irgendwas läuft doch da schief. thx
 
Es hindert dich niemand daran, wild im Speicher herumzuschreiben. Zumindest solange, bis du nicht etwas anderes wichtiges überschreibst und dein Programm abstürzt. Das soll aber nicht heissen, dass es richtig ist...

Achja, und das sieht mir falsch aus:
Code:
realloc(ms, 8*sizeof(struct ms));

müsste eher so aussehen:
Code:
s = realloc(s, 8*sizeof(struct ms));
 
Zuletzt bearbeitet:
Das Beispiel hier müsste doch dem entsprechen, was du machen willst:
http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

Du kannst natürlich immer auf alle Elemente eines Array zugreifen und darüber hinaus. Wenn es nicht initialisiert ist, steht da halt was zufälliges drin. Und danach greifst du eben auf irgendetwas im Programmspeicher zu.

Anonsten gäbe es da noch verkettete Listen. Wenn du sowieso schon structs benutzt wären die vielleicht sogar praktischer:
http://perlgeek.de/de/artikel/einfach-verkettete-listen
 
Zuletzt bearbeitet:
Danke euch für eure Antworten. Ich bin beim Array geblieben und kann nun einfügen und entfernen.
 
Zurück
Oben