Hallo, Ich möchte ein array definieren aber keine bestimmte Anzahl der Elemente eingeben. Die Definition soll etwa so aussehen; char n; char Array[n]; Die Variable n möchte ich später bestimmen.Aber bei Compilierung dieses Programmes gibt der Keil Software ein Fehler Meldung. Was kann ich machen damit ich so ein Array kriegen kann? Oder ist es überhaupt möglich? MfG Stern
In VB gibt es "Redim". Auf sowas haben die C-Entwickler keinen Wert gelegt, da es dynamische Datenstrukturen (Verkettete Listen) gibt. Die sind im "Kernighan/Ritchie" auch wunderbar beschrieben. Stichwort wäre noch "malloc" (oder war das C++?). Gruß Rahul
Mit verketteten Listen hat das zunächst nichts zu tun. Mit char *p = NULL; deklariert man einen Pointer, der auf nichts zeigt. Mit p = malloc(Anzahl); werden Anzahl Bytes Speicher angefordert, ist p danach nicht NULL, so hat das Anfordern dieses Speichers geklappt. Mit free(p); gibt man den Speicher wieder frei. Will man die Größe des Speicherblocks verändern, geschieht dies mit pneu = realloc(p, NeueAnzahl); Dies vergrößert oder verkleinert den Speicherblock auf NeueAnzahl Bytes. Der Zugriff auf eine Element dieses angeforderten Speicherblocks erfolgt analog zum Zugriff auf ein Element eines Arrays, wahlweise mit den Array-Operatoren [] p[0] = 'A'; p[34] = 'B'; oder durch Dereferenzierung des Pointers *p = 'A'; *(p + 34) = 'B'; Es muss sichergestellt werden, daß nicht über die Grenzen des mit malloc/realloc angeforderten Speichers hinaus auf den Speicher zugegriffen wird, aber das ist ja bei automatischen Variablen nicht anders. Im Gegensatz zu automatischen Variablen, die auf dem Stack angelegt werden, werden Speicheranforderungen mit malloc auf dem Heap ausgeführt.
Nur der Vollständigkeit halber, mit alloca() kann man auch Speicher auf dem Stack reservieren, der beim Beenden der Funktion dann automatisch freigegeben wird.
@Tobi:
> ar = (char*)malloc(sizeof(char)*n);
Wer den Rückgabewert von malloc casten muß, hat stdlib.h vergessen.
Malloc liefert void*, der passt ohne händische Konversion auf alle
Zeigertypen. Durch das Casten verschleierst Du möglicherweise Fehler,
die ohne Cast vom Compiler aufgedeckt werden könnten (z.B. weil der Typ
auf int defaultet, wenn der Compiler keinen Prototypen davon hat, und
Dir dann irgendwann mal das Vorzeichen um die Ohren haut, solche
Plattformen soll's geben).
Des weiteren garantiert der Standard, daß sizeof(char) == 1 ist, Du
kannst also gleich 1*n oder nur n hinschreiben. Das ist per Definition
so, weil sizeof(foo) die Größe von foo in Vielfachen der Größe von char
angibt und sizeof(char)/sizeof(char) sich wegkürzt.
thx 4 info das casten beim malloc hab ich halt so gelernt und wenn man das immer muss gewöhnt man sich irgendwann dran :) mit dem sizeof(char) ist das gleiche, mehr der übersichtlichkeit halber, wird ja sowieso vom compiler aufgelöst. aber du hast natürlich recht
Hi bei realloc() muß man sich auch im Klaren sein das da ein komplett neues Stück Speicher angefordert wird und der Inhalt des alten da hin kopiert wird. Das kann unter Umständen doch sehr auf die Performance gehen. Matthias
>bei realloc() muß man sich auch im Klaren sein das da ein komplett >neues Stück Speicher angefordert wird und der Inhalt des alten da hin >kopiert wird. Das kann unter Umständen doch sehr auf die Performance >gehen. das passiert aber bei einer anständigen runtime library nur dann, wenn hinter dem zu vergrössendern block nicht genug freier speicher ist. und wenn du einen block verkleinerst, muss sowieso nichts umkopiert werden.
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.