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


von guest (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Das ist seit C99 absolut legal.

von tom (Gast)


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

von Lupin (Gast)


Lesenswert?

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

von peter dannegger (Gast)


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

von Tobi (Gast)


Lesenswert?

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

von guest (Gast)


Lesenswert?

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

danke jungs!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

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.