PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C]: Wie kann ich ein Array während der Laufzeit anlegen?


mf_2
2008-01-14, 21:25:10
Hallo zusammen,

Ich will in C ein zweidimensionales Array anlegen. Allerdinngs wird die Größe der ersten Dimension erst zur Laufzeit des Scriptes bestimmt.

Nun habe ich sowas versucht:

int Zahl;

scanf("%d",&zahl);

char lol[Zahl][50];

Da scheitert der Compiler jedoch bei der Zeile 'char lol[Zahl][50];' mit der Meldung 'expected constant expression'.

Wie werde ich den Fehler los?
Geht das überhaupt, so ein Array dynamisch anlegen zu lassen?

Gruß,
mf_2

Trap
2008-01-14, 21:46:38
Das geht in der 1999 aktualisierten Version von C. Die Compilerunterstützung dafür ist aber ziemlich mau.

Im normalen C kann man nur mit malloc Arrays mit dynamischer Größe erzeugen und die bekommt man nicht als 2D Arrays angesprochen.

mf_2
2008-01-14, 21:50:24
Es muß kein zweidimensionales Array sein. Mein Problem ist folgendes: Ich will mehrere Strings mit einer Maximallänge von 50 Zeichen in einer Variable speichern. Zur Not kann ich das ja auch mittels eines ASCII Trennzeichens in ein einziges Feld packen. Wie kann ich dann ein Feld der Größe Zahl*50 anlegen (via malloc)?

Trap
2008-01-14, 21:54:48
char* feld = malloc(50*zahl);

Zugreifen muss man dann so:
feld[i*50+j] anstatt feld[i][j]

und irgendwann auch free(feld) aufrufen, sonst hast du ein Speicherleck.

mf_2
2008-01-14, 22:08:26
Da bekomme ich bei der Deklaration folgenden Fehler:
error C2440: 'initializing' : cannot convert from 'void *' to 'char *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast

Gissmo
2008-01-14, 22:40:06
Bin mir gerade nicht ganz sicher, aber probier vllt mal:

char* feld;
feld = malloc(50*zahl);

Das müsste, wenn ich mich nicht irre einen Pointer mit dem Namen "feld" auf einen "char" erstellen.
Und dann im nächsten Feld dem Pointer die Speicheradresse zuweisen die malloc zurückgiebt.

(sollte ich falsch liegen.. korrigiert mich bitte ;-))

Trap
2008-01-14, 22:40:37
Achso, man muss das noch casten:
char* feld = (char*) malloc(50*zahl);

rotalever
2008-01-14, 22:58:15
Außerdem würde ich
malloc (50*zahl*sizeof(char))
machen. Hier zwar unnötig aber durchaus sinnvoll..

mf_2
2008-01-14, 23:22:51
Danke besonders an Trap, das scheint zu funzen! :)

rotalever
2008-01-14, 23:26:05
Es gibt dann auch noch realloc zum verändern...