mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Arrays in C


Autor: Stern (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char* ar;

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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Schwarz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... wieder was gelernt ...
Also gibt es "Redim" quasi ja doch in C...

Gruß Rahul

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.