mallociertes Array VS. Array mit variabler Länge [duplicate]

Lesezeit: 3 Minuten

Benutzeravatar von linusz
linusz

Es gibt zwei Möglichkeiten, einem Array, dessen Größe am Anfang unbekannt ist, Speicher zuzuweisen. Die gebräuchlichste Methode ist die Verwendung malloc so was

int * array;
... // when we know the size
array = malloc(size*sizeof(int));

Aber es ist auch in C99 gültig, das Array zu definieren, nachdem wir die Größe kennen.

... // when we know the size
int array[size];

Sind sie unbedingt das Gleiche?

  • Die zweite, auch in C99, ist NICHT immer gültig. Gemäß C99 §6.10.8.3 Conditional Feature Macros kann eine Implementierung definiert werden _STDC_NO_VLA_ und nicht Implementieren Sie Arrays mit variabler Länge und noch in der Standardkonformität sein.

    – WhozCraig

    21. Mai 2013 um 14:26 Uhr


  • Dies ist keine doppelte Frage! Keine der referenzierten Fragen enthält Einzelheiten zu den Unterschieden.

    – Jens

    21. Mai 2013 um 14:33 Uhr

  • @WhozCraig AFAIK, das ist eine Sache von 2011. Es gibt keinen solchen Abschnitt in dem, was ich habe, der vorgibt, eine Kopie des C99-Standards zu sein.

    – Daniel Fischer

    21. Mai 2013 um 14:37 Uhr

  • @WhozCraig Das ist ein Arbeitsentwurf für die Ausgabe 2011 des Standards. VLAs sind insofern optional, sie waren in der Ausgabe von 1999 nicht enthalten. Dieser Abschnitt war noch nicht in C99, er wurde irgendwann in den 12 Jahren zwischen den Standards hinzugefügt. (Und nur für den Fall hier ist der letzte Entwurf vor der Ratifizierung.)

    – Daniel Fischer

    21. Mai 2013 um 17:42 Uhr


  • @DanielFischer danke für den Link und die Klarstellung, Sir. Ich gehe keinen Tag, ohne etwas Neues zu lernen.

    – WhozCraig

    22. Mai 2013 um 3:04 Uhr

Benutzeravatar von Jens
Jens

Nein, sie sind nicht absolut gleich. Obwohl Sie in beiden Fällen die gleiche Anzahl und Art von Objekten speichern können, sollten Sie Folgendes beachten:

  • Du kannst free() ein Malloced-Array, aber Sie können nicht free() ein Array variabler Länge (obwohl es den Gültigkeitsbereich verlässt und aufhört zu existieren, sobald der einschließende Block verlassen wird). Im Fachjargon haben sie unterschiedliche Speicherdauer: zugeteilt für malloc versus automatisch für Arrays mit variabler Länge.
  • Obwohl C kein Konzept von a hat Stapelweisen viele Implementierungen ein Array mit variabler Länge aus dem Stapel zu, während malloc ordnet von der Haufen. Dies ist ein Problem bei stapelbegrenzten Systemen, z. B. vielen eingebetteten Betriebssystemen, bei denen die Stapelgröße in der Größenordnung von kB liegt, während der Heap viel größer ist.
  • Es ist auch einfacher, auf eine fehlgeschlagene Zuordnung mit zu testen malloc als bei einem Array mit variabler Länge.
  • Malloced-Speicher kann mit in der Größe verändert werden realloc()während VLAs dies nicht können (genauer gesagt nur durch erneutes Ausführen des Blocks mit einer anderen Array-Dimension – wodurch der vorherige Inhalt verloren geht).
  • Eine gehostete C89-Implementierung unterstützt nur malloc().
  • Eine gehostete C11-Implementierung unterstützt möglicherweise keine Arrays mit variabler Länge (sie muss dann definieren __STDC_NO_VLA__ als ganze Zahl 1 gemäß C11 6.10.8.3).
  • Alles andere habe ich vermisst 🙂

  • Ein VLA verlässt den Geltungsbereich (hört auf, sichtbar zu sein) am Ende des einschließenden Blocks, da es einen Blockbereich hat. Sie erlischt am Ende der Sperre, da sie eine automatische Speicherdauer hat. Zwei verschiedene Dinge.

    – Keith Thompson

    21. Mai 2013 um 15:02 Uhr

  • @KeithThompson: Um genau zu sein, geht der Bezeichner für das Array am Ende der umschließenden Blöcke aus dem Gültigkeitsbereich. Geltungsbereiche sind Eigenschaften von Bezeichnern (Namen), nicht von Objekten. Auf ein Objekt kann außerhalb des Geltungsbereichs seines Bezeichners zugegriffen werden, beispielsweise wenn seine Adresse an eine andere Routine weitergegeben wird.

    – Eric Postpischil

    21. Mai 2013 um 16:02 Uhr

  • @EricPostpischil: Du hast mich überholt!

    – Keith Thompson

    21. Mai 2013 um 17:28 Uhr

  • @Jens Was genau meinst du damit C hat kein Konzept eines Stacks? Ich habe das zum ersten Mal gehört und bin ziemlich fasziniert. Können Sie das bitte näher erläutern?

    – stillanoob

    21. August 2018 um 8:02 Uhr


  • @Daniel main() ist der Eingang, aber möglicherweise nicht der Ausgang. Andere Funktionen zum Beenden eines Programms sind exit(), quick_exit(), _Exit() und abort().

    – Jens

    22. Juni 2020 um 8:52 Uhr

1395000cookie-checkmallociertes Array VS. Array mit variabler Länge [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy