www.mikrocontroller.net

Forum: Compiler & IDEs array-größe durch variable angeben


Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi, ich habe eine funktion an die eine variable übergeben wird, kann ich
in dieser funktion ein array mit der größe der variablen erstellen?
normalerweise müssen arrays durch konstanten definierte größen haben,
aber mein avr-gcc spuckt beim kompilieren keine fehler aus und ich
frage weil ich nicht weiß ob dann konflikte (überschreiben) mit anderen
variablen auftauchen können/werden.

hier ein beispiel:

void func(unsigned int n)
{
   unsigned char buffer[n];
   uart_read(n, buffer);
}

schonmal danke,
guest

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist seit C99 absolut legal.

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

> Das ist seit C99 absolut legal.

Ja aber ... :-) nur für die Verwendung INNERHALB der Funktion! Sollte
so auch klar dazugesagt werden. Dieses Feature ist KEIN ERSATZ für
malloc und Co.!

Der Grund ist, das dieses Array auf dem Stack angelegt wird. Mit
Beendigung der Funktion wird dieser Speicherbereich wieder recycled!

Ich weiß, ich weiß - das ist ja sowieso jedem klar! Wirklich? :-)

Schönen Tag noch,
Thomas

Autor: Lupin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dafür gibt es static... ist aber irgendwie ziemlich doof das so zu
machen.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Dieses Feature ist KEIN ERSATZ für malloc und Co.!"

Stimmt, es ist sogar noch viel besser, weil keinerlei
Verwaltungsaufwand anfällt.

Wenn es so ausreicht, ist es also malloc und Co unbedingt vorzuziehen.


Ich meide malloc und Co wie der Teufel das Weihwasser, weil es
ungeheure Disziplin erfordert, den Überblick zu bewahren.
Denn die Funktionen, die den Speicher belegen, benutzen und freigeben
können an völlig unterschiedlichen Stellen stehen. Der kleinste Fehler
in der Aufrufreihenfolge und Peng !!!


Bei normaler Speicheranforderung weiß ich dagegen immer, der Beleger
ist auch immer der Freigeber und der Benutzer ist immer nur darin.
Nie kann ich Unbelegtes versehentlich benutzen oder unbalanciert
belegen und freigeben.


Peter

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bedenke aber: Bei zu großem "n" kann es zu Stacküberläufen kommen!!!

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah verdammt stimmt ja, der gute stack
sry meine c++ tage sind schon ewig her..^^

danke jungs!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Stimmt, es ist sogar noch viel besser, weil keinerlei
> Verwaltungsaufwand anfällt.

alloca() übrigens auch nicht.  Ist ein GCC-Feature, macht
letzendlich dasselbe.  Allerdings würde ich die C99-Schreibweise
mittlerweile vorziehen, da sie eben auch jenseits des GCC
portabel ist.

Da man bei C99 Variablen auch in der Mitte einer Funktion
deklarieren darf, kann man den Wert von n auch innerhalb
der Funktion berechnen.

Der wesentliche Vorteil gegenüber malloc() ist, dass beim
Verlassen der Funktion alles wieder aufgeräumt ist.  Dafür
hat malloc() zumindest rudimentäre Vorkehrungen gegen eine
stack-heap-collision, die stackbasierte Allozierung hier
hingegen wird hemmungslos in die Variablen reinknallen, wenn
man es nur verlangt.

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.