Bevor Sie die dynamische Speicherzuweisung von C lernen, sollten Sie Folgendes verstehen:
Wie funktioniert die Speicherverwaltung in C?
Wenn Sie eine Variable mit einem Basisdatentyp deklarieren, weist der C-Compiler der Variablen automatisch Speicherplatz in einem Speicherpool zu, der als Stapel bezeichnet wird .
Beispielsweise benötigt eine Float-Variable normalerweise 4 Bytes (je nach Plattform), wenn sie deklariert wird. Wir können diese Informationen mit dem Operator sizeof überprüfen, wie im folgenden Beispiel gezeigt
#includeint main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}
Die Ausgabe wird sein:
The size of float is 4 bytes
Außerdem wird ein Array mit einer bestimmten Größe in zusammenhängenden Speicherblöcken zugewiesen. Jeder Block hat die Größe für ein Element:
#includeint main() { float arr[10];printf("The size of the float array with 10 element is %d", sizeof(arr)); return 0;}
Das Ergebnis ist:
The size of the float array with 10 element is 40
Wie bisher erfahren, wird beim Deklarieren eines Basisdatentyps oder eines Arrays der Speicher automatisch verwaltet. Es gibt jedoch einen Prozess zum Zuweisen von Speicher in C, mit dem Sie ein Programm implementieren können, bei dem die Arraygröße unentschlossen bleibt, bis Sie Ihr Programm ausführen (Laufzeit). Dieser Vorgang wird als " Dynamische Speicherzuordnung " bezeichnet.
In diesem Tutorial lernen Sie:
- Wie funktioniert die Speicherverwaltung in C?
- Dynamische Speicherzuordnung in C.
- C malloc () Funktion
- Die freie () Funktion
- C calloc () Funktion
- calloc () vs. malloc (): Hauptunterschiede
- C realloc () Funktion
- Dynamische Arrays
Dynamische Speicherzuordnung in C.
Die dynamische Speicherzuweisung ist die manuelle Zuweisung und Freigabe von Speicher gemäß Ihren Programmieranforderungen. Der dynamische Speicher wird verwaltet und mit Zeigern bereitgestellt, die auf den neu zugewiesenen Speicherplatz in einem Bereich verweisen, den wir als Heap bezeichnen.
Jetzt können Sie zur Laufzeit problemlos ein Array von Elementen dynamisch erstellen und zerstören. Zusammenfassend verwendet die automatische Speicherverwaltung den Stapel und die dynamische Speicherzuweisung C den Heap.
Die Bibliothek
Funktion | Zweck |
malloc () | Ordnet den Speicher der angeforderten Größe zu und gibt den Zeiger auf das erste Byte des zugewiesenen Speicherplatzes zurück. |
calloc () | Weist den Platz für Elemente eines Arrays zu. Initialisiert die Elemente auf Null und gibt einen Zeiger auf den Speicher zurück. |
realloc () | Es wird verwendet, um die Größe des zuvor zugewiesenen Speicherplatzes zu ändern. |
Frei() | Gibt den zuvor zugewiesenen Speicherplatz frei oder leert ihn. |
Lassen Sie uns die obigen Funktionen mit ihrer Anwendung diskutieren
C malloc () Funktion
Die Funktion C malloc () steht für Speicherzuordnung. Mit dieser Funktion wird ein Speicherblock dynamisch zugeordnet. Es reserviert Speicherplatz der angegebenen Größe und gibt den Nullzeiger zurück, der auf den Speicherort zeigt. Der zurückgegebene Zeiger ist normalerweise vom Typ void. Dies bedeutet, dass wir jedem Zeiger die Funktion C malloc () zuweisen können.
Syntax von malloc () Funktion:
ptr = (cast_type *) malloc (byte_size);
Hier,
- ptr ist ein Zeiger von cast_type.
- Die Funktion C malloc () gibt einen Zeiger auf den zugewiesenen Speicher von byte_size zurück.
Beispiel für malloc ():
Example: ptr = (int *) malloc (50)
Wenn diese Anweisung erfolgreich ausgeführt wird, ist ein Speicherplatz von 50 Byte reserviert. Die Adresse des ersten Bytes des reservierten Speicherplatzes wird dem Zeiger ptr vom Typ int zugewiesen.
Betrachten Sie ein anderes Beispiel:
#includeint main(){int *ptr;ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */if (ptr != NULL) {*(ptr + 5) = 480; /* assign 480 to sixth integer */printf("Value of the 6th integer is %d",*(ptr + 5));}}
Ausgabe:
Value of the 6th integer is 480
- Beachten Sie, dass sizeof (* ptr) anstelle von sizeof (int) verwendet wurde, um den Code robuster zu machen, wenn die * ptr-Deklaration später in einen anderen Datentyp typisiert wird.
- Die Zuordnung kann fehlschlagen, wenn der Speicher nicht ausreicht. In diesem Fall wird ein NULL-Zeiger zurückgegeben. Sie sollten also Code einschließen, um nach einem NULL-Zeiger zu suchen.
- Beachten Sie, dass der zugewiesene Speicher zusammenhängend ist und als Array behandelt werden kann. Wir können Zeigerarithmetik verwenden, um auf die Array-Elemente zuzugreifen, anstatt Klammern [] zu verwenden. Wir empfehlen, + zu verwenden, um auf Array-Elemente zu verweisen, da die Verwendung der Inkrementierung ++ oder + = die vom Zeiger gespeicherte Adresse ändert.
Die Malloc () - Funktion kann auch mit dem Zeichendatentyp sowie mit komplexen Datentypen wie Strukturen verwendet werden.
Die freie () Funktion
Der Speicher für Variablen wird beim Kompilieren automatisch freigegeben. Bei der dynamischen Speicherzuweisung müssen Sie den Speicher explizit freigeben. Andernfalls tritt möglicherweise ein Speicherfehler auf.
Die Funktion free () wird aufgerufen, um Speicher in C freizugeben / freizugeben. Indem Sie Speicher in Ihrem Programm freigeben, stellen Sie mehr für die spätere Verwendung zur Verfügung.
Zum Beispiel:
#includeint main() {int* ptr = malloc(10 * sizeof(*ptr));if (ptr != NULL){*(ptr + 2) = 50;printf("Value of the 2nd integer is %d",*(ptr + 2));}free(ptr);}
Ausgabe
Value of the 2nd integer is 50
C calloc () Funktion
Die Funktion C calloc () steht für zusammenhängende Zuordnung. Diese Funktion wird verwendet, um mehrere Speicherblöcke zuzuweisen. Es handelt sich um eine dynamische Speicherzuweisungsfunktion, mit der der Speicher komplexen Datenstrukturen wie Arrays und Strukturen zugeordnet wird.
Die Malloc () -Funktion wird verwendet, um einen einzelnen Speicherblock zuzuweisen, während die calloc () - Funktion in C verwendet wird, um mehrere Speicherblockblöcke zuzuweisen. Jeder von der Funktion calloc () zugewiesene Block hat dieselbe Größe.
Syntax von calloc () Funktion:
ptr = (cast_type *) calloc (n, size);
- Die obige Anweisung wird verwendet, um n Speicherblöcke derselben Größe zuzuweisen.
- Nachdem der Speicherplatz zugewiesen wurde, werden alle Bytes auf Null initialisiert.
- Der Zeiger, der sich derzeit im ersten Byte des zugewiesenen Speicherplatzes befindet, wird zurückgegeben.
Immer wenn ein Fehler beim Zuweisen von Speicherplatz auftritt, z. B. ein Speichermangel, wird ein Nullzeiger zurückgegeben.
Beispiel für calloc ():
Das folgende Programm berechnet die Summe einer arithmetischen Folge.
#includeint main() {int i, * ptr, sum = 0;ptr = calloc(10, sizeof(int));if (ptr == NULL) {printf("Error! memory not allocated.");exit(0);}printf("Building and calculating the sequence sum of the first 10 terms \ n ");for (i = 0; i < 10; ++i) { * (ptr + i) = i;sum += * (ptr + i);}printf("Sum = %d", sum);free(ptr);return 0;}
Ergebnis:
Building and calculating the sequence sum of the first 10 termsSum = 45
calloc () vs. malloc (): Hauptunterschiede
Es folgt der Hauptunterschied zwischen malloc () und calloc () in C:
Die Funktion calloc () ist im Allgemeinen geeigneter und effizienter als die Funktion malloc (). Während beide Funktionen zum Zuweisen von Speicherplatz verwendet werden, kann calloc () mehrere Blöcke gleichzeitig zuweisen. Sie müssen nicht jedes Mal einen Speicherblock anfordern. Die Funktion calloc () wird in komplexen Datenstrukturen verwendet, die mehr Speicherplatz benötigen.
Der von einem calloc () in C zugewiesene Speicherblock wird immer auf Null initialisiert, während er in der Funktion malloc () in C immer einen Garbage-Wert enthält.
C realloc () Funktion
Mit der Funktion C realloc () können Sie dem bereits zugewiesenen Speicher mehr Speichergröße hinzufügen. Es erweitert den aktuellen Block, während der ursprüngliche Inhalt unverändert bleibt. realloc () in C steht für Neuzuweisung von Speicher.
realloc () kann auch verwendet werden, um die Größe des zuvor zugewiesenen Speichers zu reduzieren.
Syntax von realloc () Funktion:
ptr = realloc (ptr,newsize);
Die obige Anweisung weist einen neuen Speicherplatz mit einer angegebenen Größe in der Variablen newsize zu. Nach dem Ausführen der Funktion wird der Zeiger auf das erste Byte des Speicherblocks zurückgesetzt. Die neue Größe kann größer oder kleiner als der vorherige Speicher sein. Wir können nicht sicher sein, ob der neu zugewiesene Block auf dieselbe Position wie der vorherige Speicherblock zeigt. Diese Funktion kopiert alle vorherigen Daten in die neue Region. Es stellt sicher, dass die Daten sicher bleiben.
Beispiel für realloc ():
#includeint main () {char *ptr;ptr = (char *) malloc(10);strcpy(ptr, "Programming");printf(" %s, Address = %u\n", ptr, ptr);ptr = (char *) realloc(ptr, 20); //ptr is reallocated with new sizestrcat(ptr, " In 'C'");printf(" %s, Address = %u\n", ptr, ptr);free(ptr);return 0;}
Immer wenn realloc () in C zu einer erfolglosen Operation führt, wird ein Nullzeiger zurückgegeben, und die vorherigen Daten werden ebenfalls freigegeben.
Dynamische Arrays in C.
Ein dynamisches Array in C ermöglicht es, die Anzahl der Elemente nach Bedarf zu erhöhen. C Dynamische Arrays werden häufig in Algorithmen der Informatik verwendet.
Im folgenden Programm haben wir ein dynamisches Array in C erstellt und in der Größe geändert
#includeint main() {int * arr_dynamic = NULL;int elements = 2, i;arr_dynamic = calloc(elements, sizeof(int)); //Array with 2 integer blocksfor (i = 0; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);elements = 4;arr_dynamic = realloc(arr_dynamic, elements * sizeof(int)); //reallocate 4 elementsprintf("After realloc\n");for (i = 2; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);free(arr_dynamic);}
Ergebnis des C Dynamic Array-Programms auf dem Bildschirm:
arr_dynamic[0]=0arr_dynamic[1]=1After reallocarr_dynamic[0]=0arr_dynamic[1]=1arr_dynamic[2]=2arr_dynamic[3]=3
Zusammenfassung
- Wir können den Speicher dynamisch verwalten, indem wir Speicherblöcke nach Bedarf im Heap erstellen
- In C Dynamic Memory Allocation wird der Speicher zur Laufzeit zugewiesen.
- Die dynamische Speicherzuweisung ermöglicht die Bearbeitung von Zeichenfolgen und Arrays, deren Größe flexibel ist und die jederzeit in Ihrem Programm geändert werden können.
- Dies ist erforderlich, wenn Sie keine Ahnung haben, wie viel Speicher eine bestimmte Struktur belegen wird.
- Malloc () in C ist eine dynamische Speicherzuweisungsfunktion, die für Speicherzuweisung steht, die Speicherblöcke mit der spezifischen Größe auf einen Garbage-Wert initialisiert
- Calloc () in C ist eine zusammenhängende Speicherzuweisungsfunktion, die mehrere Speicherblöcke gleichzeitig zuweist, die auf 0 initialisiert sind
- Realloc () in C wird verwendet, um den Speicher entsprechend der angegebenen Größe neu zuzuweisen.
- Die Funktion Free () wird verwendet, um den dynamisch zugewiesenen Speicher zu löschen.