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
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
dafür gibt es static... ist aber irgendwie ziemlich doof das so zu machen.
"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
Bedenke aber: Bei zu großem "n" kann es zu Stacküberläufen kommen!!!
ah verdammt stimmt ja, der gute stack sry meine c++ tage sind schon ewig her..^^ danke jungs!
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.