Announcement

Collapse
No announcement yet.

Verstehe den Sinn von malloc nicht ganz

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verstehe den Sinn von malloc nicht ganz

    Hallo!

    Ich verstehe den Vorteil von malloc nicht ganz.

    Da geht es ja darum, dass man Speicher dynamisch reservieren kann, wenn man z. B. nicht weiß, wie groß ein Array sein soll.

    Aber ich muss da ja immer schon angeben, wie groß der Speicherbereich sein soll, oder?

    Ich muss ja immer schreiben:
    Code:
    int *p = (int) malloc(100 * sizeof(int))
    (oder irgendeine andere ganze Zahl als 100)

    Da muss ich ja auch schon wissen, dass ich einen Speicherbereich brauche, der 100 ints entspricht.

    Das Ganze kann ich doch nur dann wirklich dynamisch machen, wenn ich den Benutzer eine Zahl eingeben lasse und diese Zahl dann als Multiplikator verwende, also
    Code:
    int n = Benutzeringabe;
    
    int *p = (int) malloc (n * sizeof(int));
    Irgendwie blick ich nicht, was da der große Vorteil ist. Sorry für die doofe Frage

  • #2
    Ich verstehe die Frage nicht.
    Warum/Wieso soll es einen Vorteil gegenüber was geben?

    in c/c++ ist nun mal Speicher mit malloc/new zu reservieren.

    Und sicher kann du das so wie zum Schluß beschrieben machen
    Zuletzt editiert von Christian Marquardt; 27.03.2015, 12:53.
    Christian

    Comment


    • #3
      Naja, so wie ich das verstanden hatte, ist das Problem an Folgendem:

      Code:
      int arr[10];
      dass man eben direkt angeben muss, dass man für 10 Elemente Speicherplatz braucht, dass das Array 10 Elemente hat.

      Und die Lösung soll sein, dass man mit malloc dynamisch Speicher reserviert, wenn man im Voraus nicht weiß, wie viele Elemente man denn genau speichern muss.

      Aber bei dem Aufruf hier:
      Code:
      int *p = (int) malloc(100 * sizeof(int))
      gebe ich ja auch schon die Anzahl an Elementen an, für die ich Speicher reservieren will.

      Ich muss doch in beiden Fällen wissen und angeben, wie viel Speicher ich haben will, oder?

      Comment


      • #4
        Und sicher kann du das so wie zum Schluß beschrieben machen
        !!!




        http://www.cplusplus.com/reference/cstdlib/malloc/
        Christian

        Comment


        • #5
          Bei int ist das mit Sicherheit übertreiben, weil ein Integer in den meisten Fällen so groß ist wie eine Speicherzelle Deines Computers. Malloc brauchst Du aber auf jeden Fall immer dann wenn das was Du speichern willst nicht in eine Speicherzelle passt. Das kann z.B. bei Structs hilfreich sein.

          Comment


          • #6
            @Christian: Ich glaube, hier wäre mehr los, wenn du nicht immer so komisch antworten würdest... Vielleicht glaubst du ja, dass deine Antwort total offensichtlich ist, aber ich hab keinen Plan, was du mir eigentlich sagen willst.

            @fanderlf: Könntest du mir da ein Beispiel geben? Mal ein Beispiel, wie ich Speicher reserviere für ein struct, dessen Größe ich nicht kenne.

            Comment


            • #7
              Die Qualität der Antworten hängt auch oft zusammen mit der Qualität der Fragen

              Ich verstehe den Vorteil von malloc nicht ganz.
              Da geht es ja darum, dass man Speicher dynamisch reservieren kann, wenn man z. B. nicht weiß, wie groß ein Array sein soll.
              malloc ist einfach zum anfordern von Speicher. Und immer wenn man Speicher anfordert egal über welche Methode muß man Wissen wieviel man den braucht. Das nimmt einem keine Low-level Methode ab.
              Wenn du eine dynamische Größe brauchst die sich ändert brauchst du ein entsprechendes Konzept zum reallokieren von Speicher. Heißt bei einem Array wenn du 11 anstatt 10 Elemente brauchst mußt du entsprechend viele Elemente reallokieren und üblicherweise eben Daten rüberkopieren. Nichts anderes beim malloc wenn du jetzt mehr Speicher brauchst als eben dann mußt du jetzt entsprechend mehr speicher anfordern und eventuell Speicher Inhalte verschieben wenn du denn Speicher zusammenhängend mit den alten Daten brauchst.

              Insofern ist deine Annahme auf der du die Frage aufgebaut hast schon falsch. malloc ist nicht für eine besondere Form der Dynamik die dir eine Array instanziierung oder ein normales new auf einer Klasse nicht liefern kann sondern ganz genauso einfach auch nur ein Speicheranforderung. Vielleicht erklärt sich dir der Sinn eher wenn du an Historische Zusammenhänge denkst. malloc ist das von c geerbte Verfahren zur Speicherallokierung über das so Dinge wie new und new[] nur drübergelegt sind. Es ist einfach älter. Es ist eine niedrigerer Abstraktionschicht. Da C++ um c herumgebaut ist hat man eben noch alle Möglichkeiten aus c. Ganz einfach darum weil es damals und heute auch noch viel c Code gibt. Hätte man C++ ohne C Kompatibilität eingeführt wäre es vermutlich innerhalb kürzester Zeit wieder verstorben. Was einmal in eine Sprache einzug gehalten hat ist so gut wie nicht mehr zu entfernen. Insofern findest du in c/c++ ganze Generationen von Lösungen für gleiche/ähnliche Probleme.

              Mal ein Beispiel, wie ich Speicher reserviere für ein struct, dessen Größe ich nicht kenne.
              Unmöglich. Du kannst nur im Zweifel soviel Speicher anfordern das es immer klappt auch wenn dann viel Speicher ungenutz bleibt. Besser ist wie gesagt ein Reallokierungsverfahren. Fang klein bzw. passend an und wenn du doch mehr brauchst realloziere und verschiebe Speicher.

              Comment


              • #8
                Guten Tag Community

                Wenn ich vielleicht noch was hinzufügen darf.

                Ich habe noch nicht vor langer Zeit angefangen mit C/C++ zu programmieren. Man wird sehr schnell mit dem Thema Speicherreservierung konfrontiert.

                Ich programmiere mit MSVC und ich hab hier die Erfahrung gemacht, das maloc dafür nicht so geeignet ist. Ich weiss es nicht ob es in Visual C++ besser ist, aber sobald ich mit Klassen arbeite, habe ich nur probleme wenn ich maloc einsetze. Mit "new + delete" hingegen klappt alles optimal.

                Freundliche Grüsse

                exc-jdbi

                Comment


                • #9
                  new = C++
                  malloc = C

                  für ein struct, dessen Größe ich nicht kenne.
                  Da ein struct nur aus nativen Typen bestehen kann,ist die Größe immer bekannt

                  Ich glaube, hier wäre mehr los, wenn du nicht immer so komisch antworten würdest... Vielleicht glaubst du ja, dass deine Antwort total offensichtlich ist, aber ich hab keinen Plan, was du mir eigentlich sagen willst.
                  Nochmal lesen? Ging mit mit deiner Frage genau so. Die Frage nach dem Vorteil? Unter C gibt es nur malloc für dyn. Speicher. Wo jetzt also der Vorteil gegenüber WAS?
                  Und wenn ich schreibe du kannst das so machen wie du zu Schluß beschrieben hast...
                  Was ist daran nicht verständlich und warum hast du es nicht ausprobiert???

                  Und keine Sorge hier melden sich je Tag 10-20 polnische Spammer an, die das Forum als "Linkgenerator" nutzen. Leider tun die Eigentümer nichts dagegen. Ich befinde mich im Abnabelungsprozess
                  Zuletzt editiert von Christian Marquardt; 30.03.2015, 18:55.
                  Christian

                  Comment


                  • #10
                    @Christian: Mein Kommentar bezog sich auf diese Antowort:


                    Und sicher kann du das so wie zum Schluß beschrieben machen
                    !!!


                    Okay, also dass malloc die C-Version von new ist, das ist jetzt klar, aber ich dachte, das Ganze z. B. auch für Situationen gedacht, in denen man in Java z. B. eine ArrayList nehmen würde: Ich weiß von vornherein nicht, wie viele Elemente ich in dieser Liste speichern muss. Mich hat nur verwirrt, dass man bei malloc wiederum die Anzahl der Speicherstellen angeben muss. Das wäre ja so, als würde ich bei ArrayList auch wieder angeben, wie viele Elemente ich speichern will und den ganzen Vorteil zunichte machen. Aber ich schätze, dass das mit der ArrayList nicht dasselbe ist, wie dynamisch Speicher anzufordern, richtig?

                    Comment


                    • #11
                      Aber ich schätze, dass das mit der ArrayList nicht dasselbe ist, wie dynamisch Speicher anzufordern, richtig?
                      Der Vergleich macht definitiv keinen Sinn (Ich spar mir das mit den Apfeln, Birnen und den ganzen Schmu). Eine ArrayList ist ein HighLevel Ding. malloc ein LowLevel Ding. Eine ArrayList ist nix als eine Kapselung eines Array die das macht was ich in Beitrag 7 beschrieben habe. Nämlich jedesmal wenn du etwas hinzufügst das interne Array zu resizen wenn nötig (also checken passt es noch ins Array, wenn nicht dann neues größeres Array ranholen, Objekte umfüllen, altes Array löschen etc.). Und ein Array ist nix anderes als eine Kapselung einer LowLevel Speicheranforderung (ähnlich malloc) um Speicher vom Betriebssystem zu bekommen. Zumindest in den meisten Sprachen. In C/C++ ist ein Array eher nur eine andere Art des Speicherzugriffs (syntactic sugar wie man so gerne sagt). Wenn du eine dynamische Speicheranforderung brauchst dann brauchst du ein intelligente Schicht (einen Speichermanager) der das auf eine Speicheranforderung mit fixer Größe mappt. Ein eher passendes Äquivalent zur ArrayList wäre std::List.

                      Comment


                      • #12
                        "Das wäre ja so, als würde ich bei ArrayList auch wieder angeben, wie viele Elemente ich speichern will"
                        http://docs.oracle.com/javase/7/docs...yList%28int%29
                        http://docs.oracle.com/javase/7/docs...acity%28int%29
                        Wenn du unter Java performant programmieren willst, beachtest du solche Konstruktoren/Methoden

                        Es wird wohl kein System geben, das Speicher mal ebenso aus dem Nichts generieren kann. Es gibt nur Systeme, die das verändern des Speichers dem Anwender abnehmen und das verstecken und die Änderung so performant wie möglich durchführen (Java: List, C/C++ std::List)

                        Des Weiteren ist mir nicht klar, was an dem von dir zitierten Satz unverständlich ist.
                        Christian

                        Comment


                        • #13
                          Ralf hat das schon sehr gut beschrieben. Die Array Syntax in C ist im Prinzip nur syntactic sugar fuer Pointer:

                          [highlight=c]
                          // die pointer und array sind am Ende dasselbe
                          int *pointer = (int *) malloc(sizeof(int) * 3);
                          int array[3];

                          // genauso verhaelt sich das beim Zugriff
                          *(pointer + 1) = 1;
                          array[1] = 1;

                          // du kannst die Schreibweisen sogar austauschen
                          pointer[2] = 123;
                          *(array + 2) = 123;
                          [/highlight]

                          Hast Du denn verstanden wie Pointer funktionieren?

                          Comment


                          • #14
                            okay, vielen Dank an alle (auch an Christian ) für die Antworten.

                            Ja, Pointer kenne ich und habe ich auch verstanden, denke ich. Danke!

                            Comment

                            Working...
                            X