Dynamisches Zuweisen eines Arrays in C
-
Verwenden Sie die Funktion
malloc
, um ein Array dynamisch in C zuzuweisen -
Verwenden der Funktion
realloc
zum Ändern eines bereits allokierten Speicherbereichs in C - Makro verwenden, um die Zuweisung für ein Array gegebener Objekte in C zu implementieren
Dieser Artikel demonstriert mehrere Methoden, wie ein Array in C dynamisch zugewiesen werden kann.
Verwenden Sie die Funktion malloc
, um ein Array dynamisch in C zuzuweisen
Die Funktion malloc
ist die Kernfunktion für die Zuweisung des dynamischen Speichers auf dem Heap. Sie allokiert die angegebene Anzahl von Bytes und gibt den Zeiger auf den Speicherbereich zurück. Wenn man also ein Array bestimmter Objekttypen dynamisch allozieren will, sollte zunächst ein Zeiger auf den Typ deklariert werden. Anschließend sollte malloc
aufgerufen werden, indem die Anzahl der Elemente multipliziert mit der Größe des einzelnen Objekts als Argument übergeben wird.
Im folgenden Beispiel wird der Speicher zum Speichern einer Zeichenkette allokiert. Wie vom Secure Coding Standard gefordert, wird errno
auf 0 gesetzt, und der vom malloc
-Aufruf zurückgegebene Zeiger wird überprüft, um die erfolgreiche Ausführung der Funktion zu verifizieren. Schließlich wird die Funktion memmove
verwendet, um die Zeichenkette an den zugewiesenen Speicherplatz zu kopieren.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
const char *str = "random string to be moved";
int main() {
char *arr = NULL;
errno = 0;
arr = malloc(SIZE * sizeof(char));
if (!arr) {
perror("malloc");
exit(EXIT_FAILURE);
}
memmove(arr, str, strlen(str));
printf("arr: %s\n", arr);
free(arr);
exit(EXIT_SUCCESS);
}
Ausgabe:
arr: random string to be moved
Verwenden der Funktion realloc
zum Ändern eines bereits allokierten Speicherbereichs in C
Die Funktion realloc
wird verwendet, um die Größe des Speicherbereichs zu ändern, der zuvor durch den Aufruf von malloc
zugewiesen wurde. Sie nimmt die ursprüngliche Speicheradresse und die neue Größe als zweites Argument an. Beachten Sie, dass realloc
den gleichen Zeiger wie übergeben oder einen anderen zurückgeben kann, abhängig von der angeforderten Größe und dem verfügbaren Speicher nach der angegebenen Adresse. In der Zwischenzeit wird der Inhalt des vorherigen Arrays bis zur neu angegebenen Größe unverändert bleiben.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
const char *str = "random string to be moved";
int main() {
char *arr = NULL;
errno = 0;
arr = malloc(SIZE);
if (!arr) {
perror("malloc");
exit(EXIT_FAILURE);
}
int num = 102; // User Provided Value
for (int i = 0; i < num; ++i) {
if (i > SIZE) {
arr = realloc(arr, 2 * SIZE);
if (!arr) {
perror("realloc");
exit(EXIT_FAILURE);
}
}
arr[i] = 'a';
}
free(arr);
exit(EXIT_SUCCESS);
}
Makro verwenden, um die Zuweisung für ein Array gegebener Objekte in C zu implementieren
Normalerweise wird malloc
verwendet, um ein Array aus einigen benutzerdefinierten Strukturen zuzuweisen. Da malloc
den Zeiger void
zurückgibt und implizit auf jeden anderen Typ gecastet werden kann, ist es eine bessere Praxis, den zurückgegebenen Zeiger explizit auf den entsprechenden Typ zu casten. Da es relativ einfach ist, Dinge zu übersehen und nicht die richtige Notation einzubeziehen, haben wir einen Makro-Ausdruck implementiert, der die Anzahl der Elemente im Array und den Objekttyp nimmt, um automatisch die richtige malloc
-Anweisung zu konstruieren, einschließlich des richtigen Casts.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
typedef enum {
Jan,
Feb,
MAR,
APR,
MAY,
JUN,
JUL,
AUG,
SEP,
OCT,
NOV,
DEC
} month;
typedef struct {
unsigned char dd;
month mm;
unsigned yy;
} date;
#define MALLOC_ARRAY(number, type) ((type *)malloc((number) * sizeof(type)))
int main() {
date *d = NULL;
errno = 0;
d = MALLOC_ARRAY(SIZE, date);
if (!d) {
perror("malloc");
exit(EXIT_FAILURE);
}
free(d);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook