Wann und warum sollte man malloc verwenden?

Lesezeit: 7 Minuten

Benutzeravatar von pr1m3x
pr1m3x

Nun, ich kann nicht verstehen, wann und warum es erforderlich ist, Speicher zuzuweisen malloc.

Hier ist mein Code:

#include <stdlib.h>

int main(int argc, const char *argv[]) {

  typedef struct {
    char *name;
    char *sex;
    int age;
  } student;


  //Now I can do two things
  student p;

  //or
  student *ptr = (student *)malloc(sizeof(student));

  return 0;
}

Warum muss Speicher zugewiesen werden, wenn ich ihn nur verwenden kann? student p;?

  • Lesen Sie ein gutes C-Programmierbuch. Es wird Heap-zugewiesenen Speicher viel besser und schneller erklären, als ich es in ein paar Minuten erklären kann.

    – Basile Starynkevitch

    10. Januar 2012 um 8:42 Uhr

  • Sie müssen sich mit den Unterschieden zwischen Heap- und Stack-Speicher vertraut machen, werfen Sie einen Blick auf diese Frage: stackoverflow.com/questions/79923/…

    – Jlledom

    10. Januar 2012 um 8:50 Uhr

  • Vergessen Sie nicht anzurufen free nach malloc/calloc etc…

    – Jotik

    14. Juli 2016 um 15:36 Uhr

Benutzeravatar von taskinoor
Taskinoor

malloc wird für die dynamische Speicherallokation verwendet. Wie gesagt, es handelt sich um eine dynamische Zuweisung, was bedeutet, dass Sie den Speicher zur Laufzeit zuweisen. Zum Beispiel, wenn Sie die Speichermenge während der Kompilierzeit nicht kennen.

Ein Beispiel soll dies verdeutlichen. Angenommen, Sie wissen, dass es maximal 20 Schüler geben wird. So können Sie ein Array mit statischen 20 Elementen erstellen. Ihr Array kann maximal 20 Schüler aufnehmen. Aber was ist, wenn Sie die Anzahl der Studenten nicht kennen? Angenommen, die erste Eingabe ist die Anzahl der Schüler. Es können 10, 20, 50 oder was auch immer sein. Jetzt nehmen Sie die Eingabe n = die Anzahl der Schüler zur Laufzeit und weisen so viel Speicher dynamisch zu malloc.

Dies ist nur ein Beispiel. Es gibt viele Situationen wie diese, in denen eine dynamische Zuordnung erforderlich ist.

Schau mal in die Manpage malloc(3).

  • Nur weil nicht bekannt ist, wie viel Speicher zur Kompilierzeit benötigt wird, heißt das nicht, dass der Heap beteiligt sein muss.

    – Matt Tischler

    10. Januar 2012 um 9:00 Uhr


  • @Matt Joiner, das war EIN Beispiel. Wenn Sie der Meinung sind, dass dies eine Herabstufung wert ist, habe ich nichts zu sagen.

    – Taskinoor

    10. Januar 2012 um 9:03 Uhr


  • @Matt Joiner, hat die Antwort ein wenig bearbeitet. Vielleicht klingt es jetzt besser.

    – Taskinoor

    10. Januar 2012 um 9:07 Uhr


  • Diese Antwort erwähnt nicht die sehr wichtige Verwendung von malloc um Speicher mit einer Lebensdauer zuzuweisen, die über die der Ausführung des aktuellen Blocks hinausgeht.

    – Eric Postpischil

    24. Juni 2018 um 13:59 Uhr

Benutzeravatar von Necrolis
Nekrolis

Sie nutzen malloc wenn Sie Objekte zuweisen müssen, die über die Lebensdauer der Ausführung des aktuellen Blocks hinaus existieren müssen (wobei ein Copy-on-Return ebenfalls teuer wäre), oder wenn Sie Speicher zuweisen müssen, der größer ist als die Größe dieses Stapels (dh: Ein lokales 3-MB-Stack-Array ist a Schlecht Idee).

Bevor C99 VLAs einführte, Sie auch erforderlich Es dient zur Zuweisung eines Arrays mit dynamischer Größe, wird jedoch zur Erstellung dynamischer Datenstrukturen wie Bäume, Listen und Warteschlangen benötigt, die von vielen Systemen verwendet werden. Es gibt wahrscheinlich noch viele weitere Gründe, dies sind nur einige.

  • lexikalischer Umfang und Speicherdauer sind zwei verschiedene Dinge. Ein Objekt kann einen Blockbereich und eine statische Speicherdauer haben.

    – au

    10. Januar 2012 um 10:18 Uhr

  • @ouah: dann wäre es kein Stack-zugewiesenes Objekt, worauf ich mich beziehe.

    – Nekrolis

    10. Januar 2012 um 10:46 Uhr

  • Vor C99 konnten Sie verwenden alloca. Abgesehen davon ist dies die richtigste Antwort und sollte als Lösung markiert werden.

    – Matt Tischler

    10. Januar 2012 um 15:55 Uhr


Benutzeravatar von ArcticPhoenix
Arktischer Phönix

Erweitern Sie die Struktur des Beispiels ein wenig und betrachten Sie Folgendes:

#include <stdio.h>

int main(int argc, const char *argv[]) {

typedef struct {
 char* name;
 char* sex;
 char* insurace;
 int age;
 int yearInSchool;
 float tuitionDue;
}student;


//Now I can do two things
student p;

//or
student *p = malloc(sizeof *p);

}

C a ist eine Sprache, die implizit als Wert und nicht als Referenz übergibt. Wenn wir in diesem Beispiel ‘p’ an eine Funktion übergeben, um daran zu arbeiten, würden wir eine Kopie der gesamten Struktur erstellen. Dies verbraucht zusätzlichen Speicher (die Gesamtmenge an Speicherplatz, die diese bestimmte Struktur benötigen würde), ist langsamer und lässt sich möglicherweise nicht gut skalieren (mehr dazu in einer Minute). Wenn wir jedoch *p übergeben, übergeben wir nicht die gesamte Struktur. Wir übergeben nur eine Adresse im Speicher, die auf diese Struktur verweist. Die übergebene Datenmenge ist kleiner (Größe eines Zeigers), daher ist die Operation schneller.

Wenn Sie dies wissen, stellen Sie sich nun ein Programm (wie ein Studenteninformationssystem) vor, das Tausende oder sogar Zehntausende von Datensätzen erstellen und verwalten muss. Wenn Sie die gesamte Struktur als Wert übergeben, dauert es länger, einen Datensatz zu verarbeiten, als nur einen Zeiger auf jeden Datensatz zu übergeben.

  • Kannst du nicht einfach einen Zeiger auf eine Funktion mit übergeben &p und trotzdem vermeiden malloc?

    – Nitin Savant

    19. Juli um 17:15 Uhr

Lassen Sie uns versuchen, diese Frage unter verschiedenen Aspekten anzugehen

Größe

malloc ermöglicht es Ihnen, viel größere Speicherplätze zuzuweisen als die, die einfach mit zugewiesen werden student p; oder int x[n];. Der Grund dafür ist malloc weist den Platz auf dem Heap zu, während der andere ihn auf dem Stack zuweist

Die Programmiersprache C verwaltet den Speicher statisch, automatisch oder dynamisch. Variablen mit statischer Dauer werden im Hauptspeicher normalerweise zusammen mit dem ausführbaren Code des Programms zugewiesen und bleiben für die Lebensdauer des Programms bestehen. Variablen mit automatischer Dauer werden auf dem Stapel zugewiesen und kommen und gehen, wenn Funktionen aufgerufen und zurückgegeben werden. Bei Variablen mit statischer Dauer und automatischer Dauer muss die Größe der Zuordnung zur Kompilierzeit konstant sein (außer bei automatischen Arrays mit variabler Länge[5]). Wenn die erforderliche Größe bis zur Laufzeit nicht bekannt ist (z. B. wenn Daten beliebiger Größe vom Benutzer oder von einer Plattendatei gelesen werden), ist die Verwendung von Datenobjekten mit fester Größe unzureichend. (aus Wikipedia)

Zielfernrohr

Normalerweise würden die deklarierten Variablen nach dem Block, in dem sie deklariert sind, gelöscht/freigegeben (sie werden auf dem Stapel deklariert). Auf der anderen Seite Variablen mit zugewiesenem Speicher using malloc verbleiben, bis sie manuell freigegeben werden.

Das bedeutet auch, dass es Ihnen nicht möglich ist, eine Variable/ein Array/eine Struktur in einer Funktion zu erstellen und ihre Adresse zurückzugeben (da der Speicher, auf den sie zeigt, möglicherweise freigegeben wird). Der Compiler versucht Sie auch davor zu warnen, indem er die Warnung ausgibt:

Warnung – Adresse des Stack-Speichers, die mit der lokalen Variablen „Übereinstimmungen“ verknüpft ist, wird zurückgegeben

Für weitere Details lesen Sie dies

Ändern der Größe (realloc)

Wie Sie vielleicht erraten haben, ist dies auf dem normalen Weg nicht möglich

Fehlererkennung

Falls kein Speicher zugewiesen werden kann: Der normale Weg kann dazu führen, dass Ihr Programm beendet wird, während malloc wird a zurückgeben NULL die leicht abgefangen und in Ihrem Programm gehandhabt werden können

In Zukunft eine Änderung am Zeichenfolgeninhalt vornehmen

Wenn Sie erstellen, speichern Sie eine Zeichenfolge wie char *some_memory = "Hello World"; du kannst nicht tun some_memory[0] = 'h'; da es als String-Konstante gespeichert wird und der Speicher, in dem es gespeichert ist, schreibgeschützt ist. Wenn Sie stattdessen malloc verwenden, können Sie den Inhalt später ändern. Weitere Informationen finden Sie in dieser Antwort

Weitere Einzelheiten zu Arrays mit variabler Größe finden Sie hier

Benutzeravatar von Acn
Acn

malloc = Memory ALLOCation.

Wenn Sie andere Programmiersprachen kennengelernt haben, haben Sie möglicherweise die verwendet new Stichwort.

Malloc macht genau dasselbe in C. Es nimmt einen Parameter, welche Größe des Speichers zugewiesen werden muss, und gibt eine Zeigervariable zurück, die auf den ersten Speicherblock des gesamten Speicherblocks zeigt, den Sie im Speicher erstellt haben. Beispiel –

int *p = malloc(sizeof(*p)*10);

Jetzt, *p zeigt auf den ersten Block der aufeinanderfolgenden 10 im Speicher reservierten ganzzahligen Blöcke.

Sie können jeden Block mit durchlaufen ++ und -- Operator.

Alles Gute.

  • Meinst du aufeinanderfolgende 10 Integer-Blöcke?

    – ich benutze das Internet

    27. Juni 2019 um 1:16 Uhr

Walid Walids Benutzeravatar
Walid Walid

Sie verwenden malloc, wenn Sie Objekte zuweisen müssen, die über die Lebensdauer der Ausführung des aktuellen Blocks hinaus existieren müssen (wobei ein Copy-on-Return ebenfalls teuer wäre), oder wenn Sie Speicher zuweisen müssen, der größer ist als die Größe dieses Stapels

  • Meinst du aufeinanderfolgende 10 Integer-Blöcke?

    – ich benutze das Internet

    27. Juni 2019 um 1:16 Uhr

Benutzeravatar von DipSwitch
DIP Schalter

In diesem Beispiel scheint es tatsächlich ziemlich nutzlos zu sein. Aber stellen Sie sich jetzt vor, Sie verwenden Sockets oder File IO und müssen Pakete variabler Länge lesen, die Sie nur während der Ausführung ermitteln können. Oder wenn Sockets verwendet werden und jede Client-Verbindung etwas Speicherplatz auf dem Server benötigt. Sie könnten ein statisches Array erstellen, aber dies gibt Ihnen ein Client-Limit, das beim Kompilieren abschreckend ist.

  • Arrays mit variabler Länge können problemlos auf dem Stack gespeichert werden. Arrays variabler Länge sind kein Grund, den Heap zu verwenden.

    – Matt Tischler

    10. Januar 2012 um 15:54 Uhr

1419710cookie-checkWann und warum sollte man malloc verwenden?

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

Privacy policy