Frage von waveboardexpert, 65

C Programmierung: Arraygröße als Variable oder Konstante?

Hallo,

wieso sollte man Arraygrößen als Konstanten und nicht als Variable definieren?

Und wenn man ein Array nur definiere und noch keine Arraygröße angebe:

int array[];

Wie viel Speicherplatz wird dann reserviert oder wird gar kein Speicher reserviert?

Danke im Voraus!

Antwort
von sebastianla, 44

Einen Grund, warum man Arraygrößen nicht als Variable definieren SOLLTE, gibt es nicht. Es ist aber in älteren Versionen des C-Standard (vor C99) so, dass man sie nur als Konstante definieren KANN.

Im Gegenteil, eine Definition nach dem Schema

char buffer[2000];

und dem Prinzip "2000 Zeichen werden wohl immer mehr als ausreichen" war schon für viele Bugs und Sicherheitslücken verantwortlich.

Bei

int array[];

wird gar kein Speicher reserviert. Das ist eine andere Schreibweise für einen Pointer.

Kommentar von waveboardexpert ,

Ich habe nämlich eine Aufgabe die heißt:

Wieso macht es Sinn, grundsätzlich die Arraygröße als Konstante zu definieren?

Kommentar von grtgrt ,

Bei konstanter Arraygröße wird der fürs Array notwendige Speicherplatz auf dem Stack allokiert (also ganz automatisch, wenn man den Block, in dem das Array zugreifbar sein soll, betritt) - zudem wird dieser Speicher automatisch freigegeben, sobald man jenen Block wieder verlässt.

Den Speicherplatz für dynamische Arrays muss man per malloc() als sog. Heap-Speicher selbst allokieren und selbst verwalten, d.h. auch ganz genau wissen, wann man ihn wieder freizugeben hat. 

Microsofts C++ Compiler (wenigstens der aus Version 6, den ich benutze) erlaubt keinen beliebig großen Stacks - wie große genau scheint nirgendwo dokumentiert. Auf jeden Fall musste ich feststellen: Sobald beim Ablauf des Programms der Stack zu tief wird, stürzt das Programm einfach ab. Es hilft dann nur, das Programm so umzuschreiben, dass einige der besonders dicken Variablen dynamisch auf dem Heap allokiert werden.

Bei einem System mit virtuellem Adressraum sollte so was eigentlich nicht notwendig sein.

Antwort
von Nube4618, 37

Ein offenes Array zu difinieren heisst, dass zur Laufzeit des Programmes die benötigten Ressourcen reserviert undauch wieder freigegeben werden müssen. Das kostet Zeit und benötigt Rechenpower. 

Ein statisch angelegtes Array bleibt von Beginn weg so wie es definiert wurde, also kaum mehr Verwaltungsaufwand zur Laufzeit. 

Was jetzt besser ist hängt von der zu erwartenden Nutzung des Arrays ab. Überlege mal, in welchen Fällen ein statisch definiertes Array sinnvoller wäre. 

Kommentar von waveboardexpert ,

Aber wieso kann ich die Arraygröße nicht als Variable speichern? Wenn ich die im Laufe des Programms nicht verändere, ist sie ja so konstant wie eine Konstante?

Oder habe ich das falsch verstanden?

Kommentar von ralphdieter ,

Eine Variable ist eine Konstante, wenn const davor steht. Das verhindert, dass sie versehentlich geändert wird. Mehr nicht.

Kommentar von Nube4618 ,

Konstanten werden vom Compiler anders behandelt als Variablen: Sie werden quasi ins Programm eingemeisselt, also ist nachträglich kein Verwaltungsaufwand mehr. Mach alles sehr schnell. Variablen werden i. A.. auf dem Stack angelegt, ist flexibler, braucht aber Verwaltungsaufwand. 

Kommentar von ralphdieter ,

Nicht wirklich! (Siehe ISO/IEC 9899:TC3, Chapter 6.6 Constant expressions)

Heutzutage haut der Compiler alles weg, was nicht gebraucht wird. Bei Konstanten passiert das vermutlich häufiger als bei Variablen, die sich ändern.

Kommentar von Nube4618 ,

Denke ich nicht. Aber ich muss zugeben, als ich mich das letzte mal mit Compilerbau beschäftigt habe, das war vor 25 Jahren...  Müsste man neu untersuchen, und ev. einige Benchmarks dazu fahren. 

In der Praxis dürfte der Unterschied sowieso meist keine grosse Rolle spielen, und in kommerziellen IT keine kommt es nicht auf en paar Microsekunden mehr oder weniger an :-) 

Kommentar von grtgrt ,

Du hast völlig recht:

Die Sprachdefinition könnte erlauben, dass die Größe eines Arrays konstanter Länge aus einer Variablen gelesen wird. In Algol 60 etwa war das möglich.

Keine passende Antwort gefunden?

Fragen Sie die Community