C Array vergrößern?
Angenommen ich hab ein Array von 10 Zahlen mit der Größe 10.
Nun will ich eine 11. Zahl hinzufügen. Wie löse ich das am besten? Sollte ich stattdessen einfach mit Linked Lists arbeiten?
2 Antworten
Moderne style c compiler haben https://en.wikipedia.org/wiki/Variable-length_array
Ein VLA kann auch nicht beliebig erweiter werden, die größe des Arrays wird nur zur Laufzeit festgelegt kann allerinds nach der Definition von dem VLA nicht mehr geändert werden.
Falsch, VLAs wurden aus gutem Grund aus dem Standard entfernt und erst gar nicht von C++ übernommen.
Wenn man auf saubere und sichere Programmierung wert legt, dann verzichtet man auf VLAs, auch wenn diese als Compilerextension zur Verfügung stehen.
VLAs waren einer der gröbsten Fehler, die jemals im C Standard eingeführt wurden, und obwohl der Fehler in den folgenden Versionen sehr schnell behoben, bzw. VLAs ersatzlos gestrichen wurden, hält sich dieses Geschwür bis heute unter Anfängern, da vermeintlich einfach einsetzbar ... was ein Trugschluss ist.
Das geht in C nicht du kannst höchstens ein größeres Array nehmen und die Daten vom alten da rein schreiben.
Die einzige Möglichkeit wäre realloc wenn du dynamische Speicherverwaltung nutzt, dazu muss das Array aber schon mit malloc erstellt worden sein.
Wenn du oft so etwas machen musst wäre eine linked List performanter weil die keine Kopieroperationen beim hinzufügen benötigt, dafür braucht sie aber je nach Elementgröße mehr Speicher weil du auch immer einen Pointer zum nächste Element speichern musst.
Eventuell kannst du das Problem umsortieren sodass du entweder ein VLA nehmen kannst sobald du die Länge kennst oder du reservierst mehr Speicher als du zu Beginn brauchst und wo deine Daten sicher passen sonst würds auch mit malloc und realloc gehn was aber eventuell nicht so performant ist wenn du den Heap häufig nutzt.
Kann man die linked Lists denn einfach in Arrays umwandeln nach der Eingabe?
Nein nicht effektiv. Du kannst höchstens mit malloc einen Speicherbreich anfordern indem du dann die Linked List alls Array speichern kannst, allerdings erhöt das die Speicherfragmentierung.
Welche Datenstruktur hier am besten ist kann man nur angeben wenn man wissen würde was du mit den Daten nacher machen musst, also musst du auf beliegige indizes zugreifen oder musst
Ich muss beliebig viele Zahle einlesen und dann jede Zahl durchgehen und mit 2 multiplizieren
Ok dann ists ein klassisches Beispiel für eine Linked List.
Lies die Zahlen in die Liste ein und dann iteriere drüber und mach bei jedem Eintrag *2.
Ist im Grunde nicht so schwer. Du hast eine struct mit einem int und einem pointer auf diese Struct.
Dein root Element legst di fix an und immer wenn eins dazu kommt machat du malloc mit dieser struct setzt den int in ihr gehst ans ende der Liste und setzt den Pointer auf dein neu erstelltes Element.
Das klingt am Anfang kompliziert ists aber im Grunde gar nicht.
Wir hatten halt in der Vorlesung noch nicht mal structs, aber ich schau mir einfach paar Videos dazu an, dann sollte das passen :D
Ich kann auch kein neues Array erstellen, da alle Variablen oben deklariert werden müssen und da kenn ich die Länge ja noch nicht :/
Dann schau ich mir mal linked Lists an, danke