Hallo, ich habe eine Frage über Strukturen. Ich habe eine Struktur und in der Struktur habe ich Arrays mit fester Größe (z.b. int xyz[10];) angelegt. Jetzt meine Frage, ich möchte die Größe der Arrays von einer Variablen abhängig machen und möchte daher der Struktur einen Parameter übergeben wenn ich Variablen von Typ der Struktur anlege !? Gibt es da eine Möglichkeit ? Danke für Eure Hilfe ! LuckyLuke
Hallo, die Möglichkeit gibt es: Du musst in Deiner Struktur statt der Arrays Zeiger verwalten. Denen kannst Du dann mit malloc() allokierte Speicherbereiche zuweisen:
1 | struct bla { char *zeiger_auf_array }; |
2 | |
3 | int main(void) |
4 | {
|
5 | struct bla example; |
6 | char *memory = malloc(123); |
7 | if( memory ) { |
8 | example.zeiger_auf_array = memory; |
9 | }
|
10 | else { |
11 | // malloc fehlgeschlagen
|
12 | } |
13 | |
14 | }
|
Beste Grüße Alfred
Die Größe von C-Arrays muss bei der Übersetzung bekannt sein, von daher ist sowas nicht möglich. Eine Parameter-Übergabe an eine Struktur ist mir grundsätzlich auch nicht bekannt.
Datentypen haben generell eine Größe, die dem Compiler bekannt ist, d.h. daß alle Instanzen deiner Struktur dieselbe Größe haben.
Arrays variabler Länge gibt es bei C zwar grundsätzlich nicht. Das letzte Element einer struct (mit mehr als einem Element) darf jedoch ein Array ohne Größenangabe sein, also
1 | struct s { |
2 | int i; |
3 | char str[]; // Das geht |
4 | };
|
Praktisch ist das bei initialisierten structs, z.B.
1 | struct s var1 = { 2, "Hallo" }; |
2 | struct s var2 = { 3, "Noch'n Menüpunkt" }; |
oder bei dynamisch verwalteten structs, z.B.
1 | // im Code
|
2 | int m; |
3 | m = 22; |
4 | struct s *p = malloc(sizeof (struct s) + sizeof (char [m])); |
wo die Maximalgröße erst beim Allozieren des Speicherplatzes bekannt ist.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.