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
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.
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
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
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
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 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
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
14197100cookie-checkWann und warum sollte man malloc verwenden?yes
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
nachmalloc
/calloc
etc…– Jotik
14. Juli 2016 um 15:36 Uhr