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.

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

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

0
@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. 

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
@waveboardexpert

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

0
@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
@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
@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
@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

C++ Array Größe richtig ermitteln?

Hey, Ich lerne grade C++ und habe ein Array (int array[5]...) erstellt. Wenn ich mit sizeof(array) nun die Länge des Arrays abfragen will kommt aber 20 (hab es bereits mit anderen Werten getestet, es sind immer 4er Schritt -> 4*5 also hier). Ist mein Befehl falsch ? Wird für ein Array Element immer ein 4 Byte Bereich reserviert ?

Danke schonmal! :)

...zur Frage

Smarty assign array - Wie String und Variable zusammenfügen?

Ich möchte gerne ein Array im Smarty-Template erzeugen was auch so gut funktioniert. Nur kann ich keine Strings und Variablen zusammenfügen was ja bei PHP ein Punkt (.) und bei Javascript ein Plus (+) ist. Ich habe bereits die Hochkommas probiert die bei Variablen auch funktionieren aber nur nicht bei Array.

{assign var=breadcrumb value=['0'=>['title'=>$lang.brand.title.0, 'url'=>'/`$lang.main.url.6`/']]}

Geht eigentlich nur um die zuweisung von url

...zur Frage

Was tun, wenn Informatiklehrer nicht einlenkt trotz richtiger Lösung?

Hey Leute, wir schrieben ein Ex im Fach Informatik und bei der Herausgabe stellte sich schon heraus, dass mir Bewertungseinheiten abgezogen wurden trotz richtiger Lösung bzw. richtigem Code. Es waren ganz banale Schreibweisen, die ich mir so beigebracht hatte wie z.B. bei der Array Deklaration, dass ich anstatt Datentyp[ ] variable halt Datentyp variable[ ] geschrieben hatte und der Lehrer mir schon Punkte abzog. Aber auch statt dem logischen Operator && !Methode() gleich &! geschrieben habe. Dafür habe ich schließlich meine Punkte bekommen, aber bei 2 Sachen wurde er sehr unfreundlich und hat mir deutlich gemacht, dass ich seine Korrektur nicht anzweifeln soll. Ich habe nämlich statt in einer Zeile Array deklariert und initialisiert, dies in 2 Zeilen getan und der hat mir dies als Fehler angestrichen obwohl es richtig ist. Begründung: Unsauberes Programmieren.

Was meint ihr nun? Was macht man dagegen? (Er ist auch leider der einzige Informatiklehrer an der Schule...)

...zur Frage

C++ komplettes Array in eine Variable speichern?

Hallo ich arbeite von der Hochschule aus an deinem Morsecode Projekt und hänge gerade an einem Problem.

Beim einlesen vom Morsecode habe ich das Problem, dass ich einzeln bis zu einem Leerzeichen die Punkt-Strich Kombination einlese und dann möchte ich das Array mit meiner Konvertierung vergleichen (also .- wird zu A, -... wird zu B etc.). Das Problem dabei ist, dass ich ein Array in das ich die einzelnen Punkt-Strich Kombinationen einlese nicht vergleichen kann sondern ich es nur als Zeiger fungieren lassen kann. Wie bekomme ich ein Array in eine "normale" Variable um sie zu vergleichen bzw. gibt es eine einfachere Variante. Der gesamte Code ist leider zu lang zum reinstellen hier ein Teil (der *Buffer ist das Problem):

    for (int i=0; i<10; i++)
        buffer[i] = 0;

    for (iB; iB < nLeerz; iB++)
    {
        buffer[iB] = feldMA[iB];
    }                                
    
    vergleicher = *buffer;

    switch (*buffer)
    {
    case '·-': printf("A");
        break; 
...zur Frage

speicherplatz für System reserviert?

habe mir vor kurzem ein laptop gekauft er reserviert 480GB allein für das system kann ich den speicher irgendwie freigeben lassen

...zur Frage

Was möchtest Du wissen?