Forum: Mikrocontroller und Digitale Elektronik Arrays in C


von Stern (Gast)


Lesenswert?

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

von Rahul (Gast)


Lesenswert?

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

von Tobi (Gast)


Lesenswert?

char* ar;

ar = (char*)malloc(sizeof(char)*n);
ar[0] = 'g';
ar[2] = '1';
usw...

von Rufus T. Firefly (Gast)


Lesenswert?

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.

von Andreas Schwarz (Gast)


Lesenswert?

Nur der Vollständigkeit halber, mit alloca() kann man auch Speicher auf
dem Stack reservieren, der beim Beenden der Funktion dann automatisch
freigegeben wird.

von Rahul (Gast)


Lesenswert?

... wieder was gelernt ...
Also gibt es "Redim" quasi ja doch in C...

Gruß Rahul

von Zotteljedi (Gast)


Lesenswert?

@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.

von Tobi (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.