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


von Daniel F. (danielosna)


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

von TestX .. (xaos)


Lesenswert?

schonmal was von malloc() und free() bzw. new und delete gehört ?

von Peter II (Gast)


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.

von Daniel F. (danielosna)


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!

von Rolf Magnus (Gast)


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.

von Sven P. (Gast)


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 :-)

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.