Wieso funktioniert das: Größe eines Arrays an Funktion übergeben und mittels [größe] initialisieren

#2244914
Lesenswert?

Ich habe hier einen Auszug aus einem Quelltext, bei dem ich mich gerade 
selber frage, warum das ganze funktioniert...
1
ViStatus HTFAPI htf2_tdms_AppendCAN
2
(
3
 ViUInt32    uiNoOfCanMsg,
4
.
5
.
6
.
7
)
8
{
9
ViByte     CAN_ucEventValue[uiNoOfCanMsg];
10
.
11
.
12
.
13
weiterer Code

Wieso funktioniert die Festlegung der Größe dynamisch? (Ja ich habe es 
ausprobiert...)

Bisher war ich immer davon ausgegangen, solche Informationen wie die 
Array-Größen müssten bereits zum Compile-Zeitpunkt festgelegt werden.

btw: Entwicklungsumgebung: LabWindows/CVI AnsiC99
Gast #2244925
Lesenswert?

Andi D. schrieb:
> schonmal was von malloc() und free() bzw. new und delete gehört ?

das spiel hier keine rolle, weil das array auf dem Stack liegt malloc 
arbeitet auf dem heap. Wenn also dann malloca() (bei MS)

Das man das array dynammsich mache kann wurde erst bei später eingeführt 
(vermutlich bei C99) vorher ging das auch nicht.
#2244934
Lesenswert?

Hat sich erledigt, ist eine Erweiterung des Ansi C99-Standards. Der 
Speicher wird automatisiert dynamisch im Stack angelegt... ist natürlich 
nur für kleine Arrays ratsam da sonst ein Stack-Overflow die Folge ist.

Das ganze wurde wohl eingeführt um Speicherlecks vorzubeugen...

und by the way: malloc() und free() sind mir sehr wohl bekannt!
Gast #2244977
Lesenswert?

Daniel F. schrieb:
> Der Speicher wird automatisiert dynamisch im Stack angelegt... ist natürlich
> nur für kleine Arrays ratsam da sonst ein Stack-Overflow die Folge ist.
>
> Das ganze wurde wohl eingeführt um Speicherlecks vorzubeugen...

Es wurde eingeführt, um eben, wenn man mal in einer Funktion lokal ein 
Array braucht, dazu nicht gleich dynamische Allokation bemühen zu 
müssen, auch wenn die Größe erst zur Laufzeit bekannt ist. Das bringt 
natürlich auch was gegen Speicherlecks, aber es ist auch auf kleinen µCs 
von Vorteil, um sich den Overhead von malloc und generell dynamischen 
Speicherverwaltung zu sparen.
Viele C-Implementationen bieten übrigens auch eine Funktion namens 
alloca() an, die ein entsprechendes Pendant zu malloc() ist, aber die 
war nie Teil von Standard-C.
Gast #2246813
Lesenswert?

Daniel F. schrieb:
> Hat sich erledigt, ist eine Erweiterung des Ansi C99-Standards. Der
> Speicher wird automatisiert dynamisch im Stack angelegt... ist natürlich
> nur für kleine Arrays ratsam da sonst ein Stack-Overflow die Folge ist.

Ist m.W.n. keine Erweiterung, sondern ist echter Teil von C99.
Den Stacküberlauf kriegst du aber auch mit lokalen Variablen und 
Prozeduraufrufen :-)

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