array-größe durch variable angeben

Gast #365026
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
Gast #365028
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
Gast #365030
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
Moderator Persönliche Seite #365033
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren