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

2 Antworten

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.

waveboardexpert 
Fragesteller
 20.11.2016, 21:03

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

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

0
grtgrt  21.11.2016, 11:47
@waveboardexpert

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.

0

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. 

Woher ich das weiß:Berufserfahrung – Jahrzehnte IT Erfahrung, Experte für Kryptowährungen, 🐱
waveboardexpert 
Fragesteller
 20.11.2016, 21:05

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?

0
ralphdieter  20.11.2016, 21:49
@waveboardexpert

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

0
Nube4618  20.11.2016, 21:57
@ralphdieter

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. 

0
ralphdieter  20.11.2016, 22:22
@Nube4618

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.

0
Nube4618  20.11.2016, 22:32
@ralphdieter

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

0
grtgrt  21.11.2016, 11:51
@waveboardexpert

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.

0