Arrays in C

Gast #137263
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
Gast #137264
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
Gast #137266
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.
Gast #137267
Nur der Vollständigkeit halber, mit alloca() kann man auch Speicher auf
dem Stack reservieren, der beim Beenden der Funktion dann automatisch
freigegeben wird.
Gast #137269
@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.
Gast #137270
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
Gast #137271
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
Gast #137272
>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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.